反向引用正则表达式

时间:2016-06-17 23:21:25

标签: php regex backreference

好的,我已经检查过了,但今天我的SearchFU并不强大。我在某些正则表达式preg_replace('~$\s*<div>([^<]*?)</div>$\s*~me', '\1', $source);中遇到了反向引用的错误,我真的可以用手了。表达式查找<div>标记,并仅返回删除标记和封闭换行符的内容。即:

<td>
        <div>some value</div>
    </td>

变为

<td>some value</td>

一切正常,直到<div>&nbsp;</div>导致:

Parse error: syntax error, unexpected '&' in D:\wamp\www\processfile.php(18)
: regexp code on line 1 Call Stack: 0.0010 143600 1. {main}()
D:\wamp\www\processfile.php:0 0.0350 170328 2. preg_replace()
D:\wamp\www\processfile.php:18 Fatal error: preg_replace(): Failed evaluating 
code:   in D:\wamp\www\processfile.php on line 18 Call Stack: 0.0010 143600
1. {main}() D:\wamp\www\processfile.php:0 0.0350 170328 2. preg_replace()
D:\wamp\www\processfile.php:18

如果我删除\ 1反向引用,表达式将很乐意删除div标签中的所有内容,但似乎想要将其解析为新表达式。

有没有解决方法,或者我应该在此行执行之前预先处理&amp; s?

1 个答案:

答案 0 :(得分:1)

这是正则表达式末尾的e修饰符。它导致替换为eval()。删除它:

preg_replace('~$\s*<div>([^<]*?)</div>$\s*~m', '\1', $source);

请参阅PHP docs for PCRE pattern modifiers