假设我的数据库内容为“超级计算机”。我想使用以下内容进行搜索:
select * from content where content REGEXP '[[:<:]]super*[[:>:]]';
我希望进行搜索的用户能够添加通配符吗?和*。我想要整个单词搜索,除非用户按照我的说明进行操作,因此使用[REGEX'super']不是一个选项。
我认为这会有效,但我想我仍然不习惯使用表达式。
答案 0 :(得分:2)
通配符*
表示正则表达式中的不同(有点)。它表示序列可以重复零次或多次,而不是有一些零或更长的文本可以替换为。
如果您希望用户能够使用这样的通配符,您将不得不进行一些预处理,但您可以使用表达式*
替换任何\w*
。这表示您期望零个或多个单词字符,而不是空格或标点符号。所以完整的表达式看起来像:
select * from content where content REGEXP '[[:<:]]super.*[[:>:]]';
这表示你想要任何以'super'开头并且只包含单词字符并且被单词边界包围的序列。
答案 1 :(得分: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; ";
}
}