Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用内置通配符的MySQL正则表达式锚_Php_Mysql_Regex - Fatal编程技术网

Php 使用内置通配符的MySQL正则表达式锚

Php 使用内置通配符的MySQL正则表达式锚,php,mysql,regex,Php,Mysql,Regex,假设我的db内容中有“超级计算机”一词。我想使用以下内容进行搜索: select * from content where content REGEXP '[[:<:]]super*[[:>:]]'; 从content REGEXP'[[::]]所在的内容中选择*; 我希望进行搜索的用户能够添加通配符,如?及*。我想要整词搜索,除非用户按照我上面解释的那样做,所以使用[REGEX'super']不是一个选项 我想这会管用,但我想我对使用表达式还是很陌生 通配符*在正则表达式中表示

假设我的db内容中有“超级计算机”一词。我想使用以下内容进行搜索:

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

从content REGEXP'[[::]]所在的内容中选择*;
我希望进行搜索的用户能够添加通配符,如?及*。我想要整词搜索,除非用户按照我上面解释的那样做,所以使用[REGEX'super']不是一个选项


我想这会管用,但我想我对使用表达式还是很陌生

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

如果希望用户能够像这样使用通配符,则必须进行一些预处理,但您可以简单地将任何
*
替换为表达式:
\w*
。这意味着您需要零个或多个单词字符,而不是空格或标点符号。所以完整的表达式如下所示:

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

从content REGEXP'[[::]]所在的内容中选择*;

这表示您需要任何以“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; ";
    }
}
$bCustom=(strpos($search,“*”)!==false&&strpos($search,“?”)!==false)?假:真;
$sql=“从内容内部选择内容。*,users.user,users.lastname,users.firstname在content.created_by=users.id上加入用户”;
$search=(trim($get['search'])==“”)?“*”:trim($get['SEARCH']);
如果($bCustom){
$search=str_replace(“*”、“*”、$search);
$search=str_replace(“?”,“,$search”);
$sql.=“WHERE content.name REGEXP'[[:::]]或content.content REGEXP'[[:::]]按content.name ASC;”排序;
}否则{
如果($search!==“”){
$sql.=“其中匹配(名称、内容)与(“$search.”“)”;
}否则{
$sql.=“按内容排序。名称ASC;”;
}
}

使用全文搜索不是更有意义吗?@Jack如果我有大量内容,搜索“超级”,我不想要“超级明星”或“超级艺术”,只需要“超级力量”的行。。。除非用户搜索“super*”。全文搜索会给完整单词的分数高于部分单词的分数。@Jack哦,等等。。。那么在MySQL中启用全文并将其用作索引?这是我第一个“真正”的php mySql web应用程序,所以可能我对直接搜索数据的想法是错误的。@Jack我在我的内容栏上启用了全文,并检查了SQL语法以使用它。谢谢你的提示。然而,即使使用匹配('super*')或('super%')也不会返回超级计算机。我正在切换到全文,但仍然需要部分搜索功能。
select*from content,其中content REGEXP'[[::]]'
似乎适用于预修复和后期修复。请确保您知道
+
的意思,此表达式将匹配
超级计算机
,因为
将匹配空格(仅当您要使用匹配项时才非常重要)但是它也不会与
中的super匹配,因为
+
需要一个或多个字符,在这种情况下,super后面没有字符。我使用了
*
,因为它将匹配零个或更多字符。嗯,我想我尝试了
*
,但它并不总是有效。在很大程度上,使用全文解决了我的大部分问题,但我仍然需要用户定义的搜索。感谢您的持续反馈!如果你用你的描述做一个完整的评论,我会把这个问题标记为已解决。你是对的
supercomputer.+
找不到,而
super.*
supercomputer.*
都匹配。对不起,我是说更新你的答案
\w
不是解决方案,但实际上是<代码>*
似乎与旧的
*
通配符相同。