通过Web表单将正则表达式特殊字符传递给PHP正则表达式

时间:2013-09-11 22:41:10

标签: php regex

我有一个可以执行搜索替换功能的网络表单。

表单输入通过preg_quote传递。到目前为止一切都很好。

现在我想允许用户输入*(星号)通配符。 preg_quote逃脱了它。我怎样才能让它通过并正确应用呢?

$find = ',*'; // I want to match a comma and all characters after the comma
$replace = ''; // replace with empty string
                    $find = preg_quote($find_replace[0],'~'); // $find == ',\*';. I want * to remain unescaped. Is replacing "\*" with "*" the best way?
                    if(strpos($find,'\\*') !== false) { // UPDATE: I tried that, and it does work.
                    // $find == ',\*'
                    $find = str_replace('\\*','*',$find);
                    // $find == ',*' -- seems like it should work but doesn't               
                }

                    $value = trim(preg_replace('~' . $find . '~i',$replace,$value));

编辑: 我在上面的代码中添加了在*之前删除转义斜杠。它正在发挥作用。

$value = 'Hey, hey, hey, hey'我最终得到了“Hey hey hey hey”。 正如所期望的那样,所有逗号都被删除了正则表达式模式,*(贪婪匹配?)。

注意,在我的代码中,我将使用$find = str_replace('\\*','.*',$find)$find = str_replace('\\*','[\s\S]*',$find)来复制Microsoft Excel查找/替换功能。

1 个答案:

答案 0 :(得分:1)

我不知道更好的方法(不要认为有任何......),但有一种方法是在preg_quote函数调用之后删除星号前的反斜杠:

$find = str_replace("\\*", "*", $find);