【问题标题】:Regular expression to change user input改变用户输入的正则表达式
【发布时间】:2010-10-22 00:25:52
【问题描述】:

我正在搜索我的数据库。如果用户输入例如。 “foo bar” 我想显示同时包含“foo”和“bar”的行。

我的 SQL 语法如下所示: SELECT * FROM t1 WHERE MATCH (t1.foo_desc, t2.bar_desc) 反对 ('+foo* +bar*')

如何使用 PHP 中的正则表达式将用户输入的“foo bar”更改为“+foo* +bar*”?

【问题讨论】:

    标签: php sql regex search


    【解决方案1】:

    我会使用正则表达式将两个单词之间的空格替换为* +

    '+' . preg_replace('/\s+/', '* +', trim($input)) . '*'
    

    编辑   基本上这是what Tomalak said的实现,只是使用\s而不是\W

    【讨论】:

      【解决方案2】:

      对于那些对 MATCH...AGAINST 语法感兴趣的人,This article 是一个不错的起点,如果您以前没有使用过它。

      【讨论】:

        【解决方案3】:
        $match = '+' . implode('* +', explode(' ', $input)) . '*';
        

        这假设输入不是空字符串;

        编辑:正如@Bart S 指出的那样,str_replace(或 mb_str_replace,如果您正在处理多字节字符)会更简单......

        $match = '+' . str_replace(' ', '* +', $input) . '*';
        

        【讨论】:

        • +1 我不明白为什么人们总是需要正则表达式来处理琐碎的任务
        • 程序员有问题。他决定使用正则表达式来解决这个问题。现在他有两个问题。
        • +1 想一想,我也不知道。 ;-) 但是,无论如何都应该进行一些规范化/检查。
        • @metaphor:现在这是一个聪明的报价。我以前从未听说过。
        • 有效,但是explode参数应该反过来:explode($input, ' ') -> explode(' ', $input)
        【解决方案4】:

        首先,修剪用户输入并删除任何奇怪的东西(标点符号、引号,基本上所有"\W",当然除了空白)。

        然后,替换:

        (?<=\w)\b
        

        "*"
        

        和:

        \b(?=\w)
        

        "+"
        

        【讨论】:

          【解决方案5】:

          您应该使用\b\B 来识别单词/非单词边界,从而插入您的+/*。

          【讨论】:

            猜你喜欢
            • 2011-07-20
            • 1970-01-01
            • 1970-01-01
            • 2016-02-26
            • 1970-01-01
            • 1970-01-01
            • 2013-12-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多