【问题标题】:Regex errors in MySQL (same regex works in PHP)MySQL 中的正则表达式错误(相同的正则表达式在 PHP 中有效)
【发布时间】:2012-05-04 23:01:58
【问题描述】:

我正在开发一个搜索功能来获取用户输入并搜索 mysql 字段 这个想法是拆分用户搜索的单词并在字段中查找每个术语 有问题。

用于构建我正在使用的正则表达式的代码是从一个工作的纯 PHP 脚本中复制而来的(正则表达式似乎与 PHP 配合得很好,所以我怀疑这是正则表达式风格的不同)

如果这是一个明显的问题,请原谅我,仍然对正则表达式有所了解。

首先,我将向您展示我运行的查询和遇到的错误

"SELECT * from `images` WHERE ( `name` REGEXP '^(?=.*gallardo).*$' OR `meta` REGEXP '^(?=.*gallardo).*$' ) ORDER BY `changestamp` DESC

从正则表达式中得到错误“重复运算符操作数无效”

SELECT * from `images` WHERE ( `name` REGEXP '^(?=.*gallardo)(?=.*lambo).*$' OR `meta` REGEXP '^(?=.*gallardo)(?=.*lambo).*$' ) ORDER BY `changestamp` DESC

给出同样的错误

为了编译这个正则表达式,我接受用户提交的输入,比如“gallardo lambo” 并运行这个 PHP 程序

if(isset($_GET['keyword'])){

        $searchterms = explode(' ',$_GET['keyword']);

        $regstr = '^';

        foreach($searchterms as $i => $v)
        {
            if($v)
                $regstr .= '(?=.*'.preg_replace('/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/', "\\$&", $v).')'; 
        }

        $regstr .= '.*$';

    }

然后我把它放在查询中

"( `name` REGEXP '$regstr' OR `meta` REGEXP '$regstr' )"

当我将此方法与 php 的 preg_match() 一起使用时,它似乎有效。

有什么见解吗?随意告诉我,我不知道自己在做什么。

谢谢!

【问题讨论】:

  • 我的直觉告诉我,在 sql 查询中使用正则表达式进行搜索可能会很慢wwww
  • (?= 是 PCRE 语法; MySQL 使用 Henry Spencer 对 v8 正则表达式的重新实现。
  • 请参阅stackoverflow.com/questions/39726749 了解可能的解决方法

标签: php mysql regex


【解决方案1】:

MySQL 正则表达式比 PHP 更受限制 - 它们不支持反向引用或前瞻。见the manual

您可能想改为查看fulltext search

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多