preg_quote和转义单引号

时间:2016-02-23 19:05:29

标签: php regex

我正在尝试使用正则表达式匹配事件标题中的艺术家名称。我的艺术家姓名可以包含各种各样的字符。我使用preg_quote()来转义正则表达式的特殊字符。

当我的字符串不包含任何引号时,这很好。但是,当它发生时,我会遇到问题。

对于以下字符串:

80's VS 90's Party Featuring Stifler's Mom (the Ultimate 90's Experien

的组合

addslashes(preg_quote($str))

...产生以下错误:

Message: preg_match(): Compilation failed: missing ) at offset 94

如果我删除addslashes(),那么我的正则表达式稍后会在以下主题字符串中失败:

Kruger Gallery's Garza Marfa Furniture & Textile Design Opening Reception

...产生以下错误:

Message: preg_match(): Unknown modifier 'G'

如何组合一个能够容忍任何特殊字符存在的正则表达式,以及单引号和/或双引号?

目前,对于我测试的每个艺术家,我的正则表达式都被编译成循环:

$pattern = "'`\b" . addslashes(preg_quote($artist_name, '`')) . "\b`'";

我使用后退标记作为分隔符,因为它们似乎是我的艺术家名称中遇到的最不可能的字符。

2 个答案:

答案 0 :(得分:1)

您应该使用Prepared Patterns,它专门为设计而设计,以处理不安全的字符。它不仅会转义字符,而且还会在使用x标志时转义空白,处理特殊的\Q\E转义,注释#(基本上所有可能的带有PHP正则表达式的情况)。

$pattern = Pattern::prepare(["`\b", [$artist_name], "\b`"]);

它还会自动为您选择定界符

答案 1 :(得分:0)

你应该像这样构建你的正则表达式:

$re = '`' . preg_quote($input, '`') . '`';

删除\b,因为您的输入也可以以非单词字符开头。

<强>测试

$input="*Testing:* 80's VS 90's Party Featuring Stifler's Mom (the Ultimate 90's Experien";
preg_match($re, $input, $m);
print_r($m);

<强>输出:

Array
(
    [0] => *Testing:* 80's VS 90's Party Featuring Stifler's Mom (the Ultimate 90's Experien
)