2016-12-16 55 views
-1

我有这样一个规律:负前瞻解析HTML

/<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/igm 

这就是我想达到的目标:

<img src="test'"/> # this should be matched, and it is 
<img data-src="abc" src="abc"/> # this one shouldn't be matched, but it is 

我不明白为什么我负前瞻不工作 - 正如你所看到的,我不希望data-src参数出现在参数src之前。

为了测试我的表达式,我使用了regex101,我的例子是基于它的。我将在PHP中使用该正则表达式。

为了满足PHP社区:

$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"/> 
+0

请出示实际投入与预期输出一起。而正则表达式不是解析HTML的正确工具 –

+0

@NarendrasinghSisodia如果你想让我使用DOMDocument或其他东西,我会简单地说 - 不。我不能依赖libxml。 – Roomy

回答

1

([^>]*?)把事情搞糟。尝试。

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

看到https://regex101.com/r/wKQk4p/1

+0

但是在src之前会有其他参数(甚至是非正确的)时它将不起作用,这就是为什么我已经放置了'([^>] ??' – Roomy

+1

我更新了我的答案...并简化了你的正则表达式。 – Fallenhero