2010-04-27 51 views
2

我看過很多問題在這裏(和更多的網站)和一些提供提示,但沒有給我一個明確的答案。我知道正則表達式,但我不是一個大師。這個特定的問題涉及PHP中的正則表達式。需要可變寬度的負向lookbehind替換

我需要在文本中找到沒有被給定類的超鏈接包圍的單詞。例如,我可能有

This <a href="blabblah" class="no_check">elephant</a> is green and this elephant is blue while this <a href="blahblah">elephant</a> is red. 

我需要來匹配第二和第三頭大象,但不是第一(通過測試類「no_check」標識)。請注意,還有更多屬性而不僅僅是超鏈接中的href和class。我想出了

((?<!<a .*class="no_check".*>)\belephant\b) 

它在正則表達式測試軟件,但不是在PHP中運行漂亮。

任何幫助,非常感謝。如果你不能提供一個正則表達式,但可以找到某種可以規避它的需求的PHP代碼邏輯,我會同樣感激。

+0

請明確你想要的輸出。 – Gordon 2010-04-27 22:19:55

回答

1

我最終使用了混合解決方案。事實證明,我必須解析特定關鍵字的文本,並檢查它們是否已經是鏈接的一部分,如果不將它們添加到超鏈接。這裏提供的解決方案非常有趣,但並不完全適合我所需要的。

雖然使用HTML解析器的想法很好,但我目前在另一個項目中使用了一個。因此,建議這種解決方案應該歸功於Alan Moore和Eric Strom。

1

如果可變寬度負向後視不可用,快速和骯髒的解決方案是反轉內存中的字符串,並使用可變寬度負向預覽。然後再次顛倒字符串。

但是,使用HTML解析器可能會更好。

1

我認爲最簡單的方法是,以匹配要麼完整<a>元素與「no_check」屬性,你要搜索的詞。例如:

<a [^<>]*class="no_check"[^<>]*>.*?</a>|(\belephant\b) 

如果是匹配的詞,它將在捕獲組#1中;如果不是,該組應該是空的或空的。

當然,通過「最簡單的方法」,我的意思是最簡單的正則表達式的方法。更簡單的是使用HTML解析器。