为什么这个正则表达式不适用于preg_ *?

时间:2012-02-22 12:28:16

标签: php regex preg-replace

我有一个正则表达式:/(<br\s*/{0,1}>)*$/gi

这样做的目的是匹配可能格式错误的字符串末尾的未知数量的<br>标记。除了break标记之外,该字符串不包含任何HTML。

这在Grant Skinner的测试工具(http://regexr.com?303ff)中运行良好,但在PHP中使用preg_replace时失败。

以下内容返回一个空字符串,但我希望最后没有任何<br>标记的原始字符串:

$string = 'Here is some text<br><br>And here is some more<br><br>and this is followed by a load of unnecessary breaks<Br><br/><br   /><br /><br><br    ><br><br>';
echo preg_replace('/(<br\s*/{0,1}>)*$/gi','',$string);

我做错了什么?

1 个答案:

答案 0 :(得分:4)

你需要逃避正斜线;它会提前终止您的正则表达式,然后由于正则表达式选项区域中的意外字符而导致错误。除此之外,删除PHP中不存在的g修饰符:

echo preg_replace('/(<br\s*\/?>)*$/i','',$string);

另一种选择是使用不同的分隔符(/在处理html时是次优的):

echo preg_replace('#(<br\s*/?>)*$#i', '', $string);

旁注:您可以而且应该使用?代替{0,1}