2010-08-06 63 views
0

我有以下字符串:如何在文本前綴後查找HTML div包含特定文本?

<div> text0 </div> prefix <div> text1 <strong>text2</strong> text3 </div> text4

,想知道羯羊它包含text3裏面的div前綴​​之後去:

prefix<div>...text3...</div>

,但我不知道該怎麼做助教正則表達式因爲我不能使用[^<]+,因爲div的內部可以包含strong標籤。

請幫

編輯:

  1. 的div標籤前綴後guaranted將沒有嵌套
  2. 語言是C#
  3. 文本4是很長,所以結束div後的正則表達式不能看

EDIT2:我不想使用html解析器,它可以很容易(而且速度更快)達到用正則表達式編輯。 HTML很簡單:標籤中沒有屬性;沒有嵌套的div。在我的情況下,甚至有一些錯誤的答案是可以接受的。

+7

你不能(可靠地)使用正則表達式來處理這個問題,因爲正如你所說的正則表達式不處理非常規的語言特性,比如HTML的嵌套/等等。 **你需要使用HTML DOM分析器 - 你想要做什麼語言?** – 2010-08-06 11:48:33

+1

你可能想要了解jquery – naugtur 2010-08-06 11:49:31

+1

什麼語言?不同的語言支持不同的RegEx功能,它們不相同。即使RegEx是錯誤的解決方案,一個好的解決方案的建議需要知道您使用的是什麼語言。 – Oded 2010-08-06 11:51:05

回答

0

這是我的新的正則表達式:

prefix<div>([^<]*<(?!/div>))*[^<]*text3([^<]*<(?!/div>))*[^<]*</div>

似乎工作正常。

0

對於C#+ HtmlAgilityPack,你可以這樣做:

InputString = Regex.Replace(InputString,"^(?:[^<]+?|<[^>]*>)*?prefix",""); 

HtmlDocument doc = new HtmlDocument(); 

doc.LoadHtml(InputString); 

HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[contains('text3')]"); 

前綴去除仍然不處理它的一個好辦法。理想情況下,您可以使用HtmlAgilityPack來查找DOM中出現的位置,將其翻譯爲在字符串中提供位置,然後執行子字符串(pos,len)(或等效)以僅查看相關文本(您也可以避免使用類似的方法查看文本4)。
恐怕我現在不能將所有的代碼翻譯成代碼;希望別人可以在那裏幫助。


(原來的答案,額外的細節提供前)
這裏是一個 的JavaScript + jQuery的解決方案:

var InputString = '<div>text0 </div> prefix <div>text1 <strong>text2</strong> text3 </div> text4'; 

InputString = InputString.replace(/^.*?prefix/,''); 

var MatchingDivs = jQuery('div:contains(text3)','<div>'+InputString+'</div>') 

console.log(MatchingDivs.get()); 

這使得使用jQuery的接受context as second argument(雖然看上去它的能力這需要被包裝在div標籤中以實際工作)。

+0

通過'prefix'拆分,然後嘗試解析其中一個產生的子字符串,如果前綴出現在標籤內,也可能導致解析錯誤。 (雖然我還沒有使用過jQuery,但我不知道它會在這種情況下表現如何。) – David 2010-08-06 12:04:30

+0

是的,那一點肯定不是很好,但是我的大腦並沒有覺醒,無法提出一個合適的解決方案。 :(通過切換到替換,我稍微改進了它。 – 2010-08-06 12:06:32

2

如果關閉「貪婪」選項,您應該只能使用prefix<div>.*text3.*</div>之類的東西。 (如果<div>允許有屬性,可以使用prefix<div[^>]*>.*text3.*</div>代替。)

大量改進可以按此在爲了考慮異常間隔,>小號引號中,引號內</div>製成,等等

prefix<div>...<div></div>text3</div>這樣的模式會更困難。您可能必須捕獲div標記的所有事件,以便您可以計算在給定時間打開了多少個div標記。

編輯:哎呀,關閉貪婪選項並不總是給出正確的結果,即使在上面的例子以外的例子。可能只是爲了捕獲所有出現的div標記並從那裏開始。正如Peter在上面指出的那樣,HTML不是regular language,所以你不能使用正則表達式去做任何你想要的東西。

相關問題