PHP preg_replace 转义反向引用正则表达式中的符号

PHP preg_replace escape ampersand in backreference regex

好的,我已经查过了,但是今天我的 SearchFU 不强。我在某些正则表达式 preg_replace('~$\s*<div>([^<]*?)</div>$\s*~me', '', $source); 中遇到了反向引用错误,我真的可以帮上忙。该表达式找到 <div> 标签和 returns 只是删除标签并包含换行符的内容。即:

<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 标记中的所有内容,但似乎想将其解析为新表达式。

有没有办法解决这个问题,或者我应该在执行此行之前预处理 & 吗?

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

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

参见PHP docs for PCRE pattern modifiers