这件事困扰了我一整天。假设这个简单的无效HTML
<p clneck="something">my neck hurts</p>
现在我想用preg_replace
用head
代替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;