使用带有通配符的MySQL REGEX锚点

时间:2013-04-12 02:55:06

标签: php mysql regex

假设我的数据库内容为“超级计算机”。我想使用以下内容进行搜索:

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

我希望进行搜索的用户能够添加通配符吗?和*。我想要整个单词搜索,除非用户按照我的说明进行操作,因此使用[REGEX'super']不是一个选项。

我认为这会有效,但我想我仍然不习惯使用表达式。

2 个答案:

答案 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; ";
    }
}