2016-12-16 58 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