【问题标题】:MySQL search for part of regexMySQL搜索正则表达式的一部分
【发布时间】:2012-01-01 11:48:00
【问题描述】:

我有一个 MySql 搜索使用正则表达式 可以正常工作。 但它只能找到完整的单词。

例如,如果我在文本“i really love apples”中搜索apples匹配。但是,如果我搜索 apple,我会得到 no result

这是我目前得到的:

$search = (ini_get('magic_quotes_gpc')) ? stripslashes($_GET['q']) : $_GET['q']; 
$search = mysql_real_escape_string($search); 
$search = strtoupper(preg_replace('/\s+/', '|', trim($_GET['q'])));

$regexp = "REGEXP '[[:<:]]($search)[[:>:]]'"; 
$query = "SELECT * FROM `food` WHERE UPPER(`fruits`) $regexp";

我真的被困住了,非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: php mysql regex


    【解决方案1】:

    是的,如果你使用 word-boundary 模式,它会按照你的要求做:

    $regexp = "REGEXP '[[:<:]]($search)[[:>:]]'";
    

    这意味着如果您搜索apple,它只会匹配e 是单词的结尾。这就是[[:&gt;:]] 模式的含义。

    您可以稍微扩展一下模式,在单词 bounary 之前包含额外的字母字符:

    $regexp = "REGEXP '[[:<:]]($search)[[:alpha:]]*[[:>:]]'";
    

    这将允许它匹配apples,例如applesauce

    【讨论】:

    • 正是我想做的。太感谢了!但是由于正则表达式 [[:<:>:]] 中缺少 (),我首先得到了一个错误
    • 这是为 PHP 变量插值吗?为了正则表达式,您不应该需要它。我将为未来的读者编辑我的答案。
    • 是否可以搜索“真正的苹果”。 ?
    • @Vincent,为什么不呢?您可以将空格放入正则表达式中。
    【解决方案2】:

    如果您想匹配字段内容中任意位置的字符串,您可以使用LIKE 运算符:

    $query = "SELECT * FROM `food` WHERE UPPER(`fruits`) LIKE '%$search%'";
    

    根据您的表排序规则,strtoupperUPPER 语句可能是多余的(通常,如果排序规则末尾有 _ci,则比较将以不区分大小写的方式执行)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多