2010-07-28 55 views
0

好的,所以我知道這個問題已經多次以不同的形式提出,但是我遇到了特定語法的問題。我有一個包含html片段的大字符串。我需要找到每個沒有target =屬性的鏈接標籤(以便我可以根據需要添加一個標籤)。正則表達式排除行爲

^((?!target).)*會給我導致'目標'的文字,<a.+?>[\w\W]+?</a>會給我一個鏈接,但那是我卡住的地方。舉例:

<a href="http://www.someSite.com>Link</a> (This should be a match) 
<a href="SomeLink.whatever target="_blank">Link</a> (this should not be a match). 

有什麼建議嗎?使用DOM或XPATH不是真正的選項,因爲這個片段不是格式正確的html。

+3

<插入必要的「不要用RegEx解析HTML/XML「評論在這裏> – Jay 2010-07-28 16:00:07

+1

<在這裏插入有用的替代解析技術> – Quad64Bit 2010-07-28 16:18:41

+0

不是一個真正的解決方案,但是我過去曾使用Jsoup庫來解析格式不正確的HTML。 http://jsoup.org/ – matiasf 2010-07-28 16:20:54

回答

0

如果你堅持用正則表達式做一個模式,如本應幫助...

<a(?![^>]*target=) [^>]*>.*?</a> 

這絕不是100%完美技術上來講標籤可以包含>除然後結束其他地方所以它不適用於所有的HTML標籤。

注意:我使用PHP工作,您可能必須對Java進行輕微的語法調整。

+0

完美的作品!謝謝你的幫助。 – Quad64Bit 2010-07-28 16:33:47

0

你可以嘗試負前瞻是這樣的: <a(?!.*?target.*?).*?>[\w\W]+?</a>

2

您正在試圖用的正則表達式解析HTML故意惡。別。

也就是說,通過嘗試在一個正則表達式中完成所有事情,你會變得更加邪惡。沒有必要這樣做;它使你的代碼與正則表達式引擎相關,不可讀,並且可能很慢。相反,只需簡單地匹配標籤,然後再用簡單的正則表達式/target=/再次檢查你的第一階段命中。當然,這個字符串可能出現在HTML標籤中的其他地方,但是請參閱(1)...你已經將好習慣拋出了窗口,爲什麼不至於讓事情變得模糊不清,這樣每個人都可以看到你的「重新做?

+0

好的,這篇文章的目的是尋找一個考慮到排除的匹配解決方案。這有很多應用程序。我不使用正則表達式解析html,我已經使用xpath和DOM來完成。我正在尋找添加一些簡單的幾行。如果唯一的解決辦法是用一個令人討厭的多層次比賽來完成,那麼我會做到這一點。我希望有人能回答我真正的問題,這與排除本身有關。顯然正則表達式沒有這種能力(它應該)。做嵌套逆比賽是多麼痛苦。 – Quad64Bit 2010-07-28 16:30:14

0

我沒有測試這一點,並花了大約一分鐘的寫作,但你具體的例子,如果你能做到這一點的客戶端,通過DOM試試這個:

var links = document.getElementsByTagName("a"); 

for (linkIndex=0; linkIndex < links.length; linkIndex++) { 
    var link = links[linkIndex]; 

    if (link.href && !link.target) { 
     link.target = "someTarget" 
     // or link.setAttribute("target", "someTarget"); 
    } 
} 
+0

您也可以通過jQuery來做到這一點,但我認爲如果您不使用jQuery,最好使用普通的老式JS。 – nickytonline 2010-07-28 16:38:25

+0

好的,我也會給你一個鏡頭。我正在尋找一種方法來做到這一點,也許這將工作。謝謝! – Quad64Bit 2010-07-28 16:43:58