客户报告了一个错误,我已将其跟踪到此代码,但我无法弄清楚它有什么问题:
$source = "This is a test.\n\n-- a <span style='color:red'>red word</span>!\n\n- a red word!\n\n";
//$find = "- a red word!"; // This one works!
$find = "- a <span style='color:red'>red word</span>!"; // This one doesn't...
$replace = "• a <span style='color:red'>red word</span>!";
$pattern = '/^' . preg_quote($find) . '$/';
$results = preg_replace($pattern, $replace, $source);
die ("Results: " . serialize($results));
我添加了一个$find
的样本,其效果与$find
不起作用。知道为什么取消注释$find
不起作用吗?
(注意:我实际上并没有尝试解析HTML,搜索纯粹是一个示例,因此我不需要对方法进行更正)
答案 0 :(得分:2)
preg_quote
不会转义</span>
中的斜杠字符,这会使图案无效。 preg_quote
允许定义模式的分隔符:
$pattern = '/^' . preg_quote($find, '/') . '$/';
答案 1 :(得分:1)
您必须删除锚点(^
$
),因为您尝试匹配的只是一个子字符串,而不是所有字符串。
$pattern = '~' . preg_quote($find) . '~';
答案 2 :(得分:1)
preg_quote
仅转义特殊的正则表达式字符:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
。因为正斜杠不是正则表达式特殊字符,所以你必须在你的模式中使用不同的分隔符,比如冒号|
$pattern = '/' . preg_quote($find) . '/';
或者为preg_quote
函数提供反斜杠分隔符作为第二个参数
$pattern = '/' . preg_quote($find, '/') . '$/';
preg_quote
函数上的From the PHP documentation(第二个参数的说明):
If the optional delimiter is specified, it will also be escaped. This is useful for escaping the delimiter that is required by the PCRE functions. The / is the most commonly used delimiter.
如同已经建议的那样摆脱^
和$
- 你不匹配整个字符串。