2017-10-06 82 views
-1

我正在解析HTML中的元標記。一切工作正常,但在某些情況下,我無法相應地解析meta標籤。無法從html解析元標記

這裏是標籤格式<meta property="fb:pages" content="6456456"/>

正則表達式string regexImgSrc = @"<meta property.*?>";

但有時我得到另一種格式meta標籤從HTML這樣的:

<meta data-react-helmet="true" property="article:publisher" content=""/> 

所以正則表達式是不獲得預期的產出。 我只需要屬性名稱和meta標籤中的內容。 這裏是我的代碼

 string regexImgSrc = @"<meta property.*?>";  
     MatchCollection matches = Regex.Matches(htmldata, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline); 

請幫

在此先感謝

+0

不建議使用正則表達式解析HTML。 html不規則,正則表達式用於正則表達式。 – jdweng

+1

爲什麼你不使用HTML解析庫(Html Agility Pack)。它只是一個建議 –

+0

不,我不想使用任何庫或第三方工具@Usman – sachin

回答

0

解析HTML與正則表達式的作品只要你HTMLS是非常有限的。例如。你只是解析一堆,例如作爲後臺進程。即使在這種情況下,您必須願意在需要時更改您的正則表達式。

這是一個稍微增強的正則表達式。請注意,它仍然不符合一切:

<meta[^>]*?property=("[^"]*"|'[^']*')[^>/]*\/> 

演示here。 說明:

  • <meta[^>]標籤的開頭匹配
  • [^>]*?匹配的東西,這不是一個結束標記。該*?是一個懶惰的量詞,所以比賽會發生稍快
  • property= property屬性
  • ("[^"]*"|'[^']*')允許屬性值要麼用撇號或引號
  • 然後再次[^>/]*匹配的東西到最後被包圍相匹配
  • 那麼這就是標籤\/>

結束那麼什麼是分析HTML真正的解決辦法?那麼,使用像HTML agility pack這樣的html解析器。

+0

無論誰低估,請解釋,出了什麼問題。即它不工作嗎?我不是警告OP關於這個正則表達式的限制嗎?我不是也建議一個基於解析器的解決方案嗎? –

0

如果你想繼續使用(簡單)的正則表達式,你可以使用這個:

<meta (?:.*?)*?property.*?> 

(?:[^<>]*?)*?表示:

  • ?:不創建捕獲組
  • .*?任何字符零次或多次,儘可能少的次數
  • space
  • (...)*?整件事零次或多次

事實上,這正則表達式將匹配任何meta標籤,其中包含了「財產」一詞。例如<meta some-attr="some property" />也是一場比賽。

這是一個快速和骯髒的方式,我也不建議使用正則表達式。


PS:我注意到,你可以「屬性」後添加=改善正則表達式位:<meta (?:.*?)*?property=.*?>