假设我有带有“超级计算机”一词的数据库内容。我想使用以下搜索:
select * from content where content REGEXP '[[:<:]]super*[[:>:]]';
我希望进行搜索的用户能够添加通配符,例如?和 *。我想要全词搜索,除非用户按照我上面解释的那样做,所以使用 [ REGEX 'super' ] 不是一个选项。
我认为这会起作用,但我想我还是不熟悉使用表达式。
通配符*
在正则表达式中意味着不同的东西(有点)。它表示一个序列可以重复零次或多次,而不是有一些长度为零或更多的文本可以替换它。
如果您希望用户能够使用这样的通配符,您将不得不进行一些预处理,但您可以简单地将 any 替换*
为表达式:\w*
。这表示您期望零个或多个单词字符,而不是空格或标点符号。所以完整的表达式看起来像:
select * from content where content REGEXP '[[:<:]]super.*[[:>:]]';
这表示您想要任何以“super”开头且仅包含单词字符并被单词边界包围的序列。
这最终成为我搜索的最终 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; ";
}
}