需要PHP多字节Regex来搜索和替换内部html


PHP Multibyte Regex to Search and Replace inner html needed

这件事困扰了我一整天。假设这个简单的无效HTML

<p clneck="something">my neck hurts</p>

现在我想用preg_replacehead 代替neck

当然是一个简单的

preg_replace("/neck/", "head")

会给我

<p clhead="something">my head hurts</p>

我想你明白了。

我在DOMDocument中尝试过构建,但失败了两次:它不是为HTML5构建的,而且在一些天堂般的嵌套标签上仍然失败了。

可以通过使用类似$1的反向引用来完成。

处理p标签的简单示例:

$input = '<p clneck="something">my neck hurts</p>';
$output = preg_replace('/(<p's+[^>]+>[^<]*)neck([^<]*<'/p>)/i', '$1head$2', $input);

要处理所有标签,它会变得有点复杂,因为我们也需要匹配正则表达式中的引用(''2):

$input = '<p clneck="something">my neck hurts</p><div idneck="foo">my neck hurts, too</div>';
$output = preg_replace('/(<('w+)('s+[^>]+)>[^<]*)neck([^<]*<'/''2>)/i', '$1head$4', $input);
echo $output;