2013-04-24 117 views
0

我知道「不要使用html的正則表達式」,但嚴重的是,加載整個html解析器並不總是一個選項。在正則表達式中匹配html標記內容

所以,這裏是該方案

<script...> 
    some stuff 
</script> 

<script...> 
    var stuff = '<'; 
    anchortext 
</script> 

如果你這樣做:

<script[^>]*?>.*?anchor.*?</script> 

你會從第一個腳本標記在第二塊/腳本捕捉。有沒有辦法做一個。*?但通過替換。與一個匹配塊,像這樣的:

<script[^>]*?>(^</script>)*?anchor.*?</script> 

我看着負向lookaheads等,但我不能得到的東西正常工作。通常我只是使用[^>] *?以避免跑過關閉塊,但在此特定示例中,腳本內容中包含「<」,並且在到達錨點文本之前停止匹配。

爲了簡化,我需要[^ z] *之類的東西?但不是單個字符或字符範圍,我需要一個捕獲組來匹配一個字符串。

.*?(?!z) doesn't have the same effect as [^z]*? as I assumed it would. 

這裏是我卡在其中:http://regexr.com?34llp

+3

http://stackoverflow.com/a/1732454/500202 – Izkata 2013-04-24 19:21:40

+1

在StackOverflow上覆制了大約一百萬個其他大致相同的問題。 – Adrian 2013-04-24 19:24:35

+0

那麼你想要捕獲什麼? – anubhava 2013-04-24 19:27:22

回答

3

比賽,任何事情,但的確通常與負先行執行:

((?!exclude).)*? 

訣竅是沒有.點重複。但要確保字符不是被排除的單詞的開始,而是使它與任何字符相繼匹配。

在你的情況,你會希望有這個代替初始.*?

<script[^>]*?>((?!</script>).)*?anchor.*?</script> 
+0

謝謝,這對於這個用例非常有用! – tweak2 2013-04-24 20:30:23

0

這樣的:

$pattern = '~<script[^>]*+>((?:[^<]+?|<++(?!/script>))*?\banchor(?:[^<]+?|<++(?!/script>))*+)</script>~'; 

但DOM是遠遠更好的方式來做到這一點。