Php 解析HTML的反向前瞻

Php 解析HTML的反向前瞻,php,regex,negative-lookbehind,Php,Regex,Negative Lookbehind,我有一个这样的模式: /<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/igm 你的([^>]*?)把事情搞砸了。试试看 <img (?!data-src=['"])[^>]*?src=(['"])(.*?)\1 ]*?src=(['”])(.*?\1 请参见请显示实际输入和预期输出。regex不是正确的分析工具HTML@NarendrasinghSisodia如

我有一个这样的模式:

/<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/igm
你的
([^>]*?)
把事情搞砸了。试试看

<img (?!data-src=['"])[^>]*?src=(['"])(.*?)\1
]*?src=(['”])(.*?\1

请参见

请显示实际输入和预期输出。regex不是正确的分析工具HTML@NarendrasinghSisodia如果你想让我使用DOMDocument或其他东西,我会简单地说-不。我不能依赖libxml。但是如果在
src
之前有其他参数,它就不起作用了(即使是不合适的),这就是我将
([^>]*?)
放在那里的原因
$html = '<img src="test\'"/><img data-src="abc" src="abc"/>';
$html = preg_replace('/<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/i', '<img$1 data-src=$3$4$3 src=$3placeholder$3', $html);
echo $html;
>>> <img data-src="test'" src="placeholder"/><img data-src="abc" src="abc"/>
<img (?!data-src=['"])[^>]*?src=(['"])(.*?)\1