我正在尝试使用正则表达式匹配事件标题中的艺术家名称。我的艺术家姓名可以包含各种各样的字符。我使用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`'";
我使用后退标记作为分隔符,因为它们似乎是我的艺术家名称中遇到的最不可能的字符。
答案 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
)