PHP preg_match返回null

时间:2013-06-30 21:26:34

标签: php regex

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

$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,搜索纯粹是一个示例,因此我不需要对方法进行更正)

3 个答案:

答案 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.

如同已经建议的那样摆脱^$ - 你不匹配整个字符串。