0

假设我有带有“超级计算机”一词的数据库内容。我想使用以下搜索:

select * from content where content REGEXP '[[:<:]]super*[[:>:]]';

我希望进行搜索的用户能够添加通配符,例如?和 *。我想要全词搜索,除非用户按照我上面解释的那样做,所以使用 [ REGEX 'super' ] 不是一个选项。

我认为这会起作用,但我想我还是不熟悉使用表达式。

4

2 回答 2

2

通配符*在正则表达式中意味着不同的东西(有点)。它表示一个序列可以重复零次或多次,而不是有一些长度为零或更多的文本可以替换它。

如果您希望用户能够使用这样的通配符,您将不得不进行一些预处理,但您可以简单地将 any 替换*为表达式:\w*。这表示您期望零个或多个单词字符,而不是空格或标点符号。所以完整的表达式看起来像:

select * from content where content REGEXP '[[:<:]]super.*[[:>:]]';

这表示您想要任何以“super”开头且仅包含单词字符并被单词边界包围的序列。

于 2013-04-12T03:14:54.760 回答
0

这最终成为我搜索的最终 PHP / MySQL 解决方案。

$bCustom = (strpos($search, "*") !== false && strpos($search, "?") !== false) ? false : true;

$sql = "SELECT content.*, users.user, users.lastname, users.firstname FROM content INNER JOIN users ON content.created_by=users.id ";

$search = (trim($get['SEARCH']) === "") ? "*" : trim($get['SEARCH']);

if ($bCustom) {
    $search = str_replace("*", ".*", $search);
    $search = str_replace("?", ".", $search);
    $sql .= "WHERE content.name REGEXP '[[:<:]]" . $search . "[[:>:]]' OR content.content REGEXP '[[:<:]]"
            . $search . "[[:>:]]' ORDER BY content.name ASC; ";
} else {
    if ($search !== "") {
        $sql .= "WHERE MATCH (name, content) AGAINST ('" . $search . "')";
    } else {
        $sql .= "ORDER BY content.name ASC; ";
    }
}
于 2013-04-13T04:01:39.327 回答