1

一位客户报告了一个错误,我已将其追溯到此代码,但我无法弄清楚它有什么问题:

$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 = "&bull; 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,搜索纯粹是一个示例,所以我不需要对方法进行更正)

4

3 回答 3

2

preg_quote不会转义</span>使模式无效的斜线字符。preg_quote确实允许为模式定义分隔符:

$pattern = '/^' . preg_quote($find, '/') . '$/';
于 2013-06-30T21:30:35.007 回答
1

您必须删除锚点 ( ^ $),因为您尝试匹配的只是一个子字符串,而不是所有字符串。

$pattern = '~' . preg_quote($find) . '~';
于 2013-06-30T21:28:34.643 回答
1

preg_quote只转义特殊的正则表达式字符,它们是:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -. 因为正斜杠不是正则表达式特殊字符,所以你必须|在你的模式中使用不同的分隔符,比如冒号

$pattern = '/' . preg_quote($find) . '/'; 

或将反斜杠分隔符preg_quote作为第二个参数提供给函数,如下所示

$pattern = '/' . preg_quote($find, '/') . '$/';

来自函数的PHP 文档preg_quote(第二个参数的描述):

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.

并摆脱^and $,正如已经建议的那样 - 你没有匹配整个字符串。

于 2013-06-30T21:45:10.623 回答