簡體   English   中英

正則表達式以匹配HTML中的屬性?

[英]Regex to match attributes in HTML?

我有一個txt文件,它實際上是某些網頁的html源。 在該txt文件中,有各種字符串,前面帶有“ title =“標簽。 例如

<div id='UWTDivDomains_5_6_2_2'  title='Connectivity Framework'> 

我有興趣獲取文本連接框架 ,並將其寫入單獨的文件中。

像這樣,有很多這樣的標簽,每個標簽在title =“我需要提取的某些文本”后都有不同的文本,我想從html源/ txt文件中提取文本的所有此類實例,並寫入單獨的txt文件。 文本只能包含小寫字母,大寫字母和數字。 每個文本字符串的長度(以字符為單位)會有所不同。

我正在Windows中使用PowerGrep。 Powergrep允許我搜索帶有正則表達式inout的文本文件。 我嘗試將搜索用作title ='[a-zA-Z0-9]

它顯示正確的匹配項,但僅匹配字符串的第一個字符,並且僅寫入與第二個txt文件匹配的文本字符串的第一個字符,而不是所有字符串。

我希望所有字符串都匹配並寫入第二個文件。

使用powergrep,正確的正則表達式或執行我想做的事情的方法是什么?

-廣告。

我只是不確定要問多少次HTML文件的正則表達式解析問題(並使用“使用DOM解析器”的正確解決方案來回答)。 它每天都會出現。

困難是:

  • 在HTML中,屬性可以有單引號,雙引號或什至沒有引號。
  • 類似的字符串可以出現在HTML文檔本身中。
  • 您必須處理正確的轉義;
  • 格式不正確的HTML(正確的解析器對於常見錯誤極為健壯)。

因此,如果您滿足所有這些要求(並且它變得非常復雜,但仍不完美的正則表達式),那么它仍然不是100%。

HTML解析器的存在是有原因的。 使用它們。

其他答案都對正則表達式進行了正確的更改,因此,我將解釋您的原始問題是什么。

方括號表示字符類別 -表示正則表達式將匹配這些括號內的任何字符。 但是,與其他所有內容一樣,默認情況下它只會匹配一次。 就像正則表達式“ s ”僅匹配“ ssss ”中的第一個字符一樣,正則表達式“ [a-zA-Z0-9] ”將僅匹配“ Connectivity Framework ”中的第一個字符。

通過添加重復 ,可以使該字符類重復匹配。 最簡單的方法是在其后添加一個星號(它將匹配0個或多個事件)。 因此,正則表達式“ [a-zA-Z0-9] *”將連續匹配多個字符,直到找到不屬於該字符類的字符為止(在您的情況下為空格字符,因為您未包括該字符)在括號中)。

盡管正則表達式要准確地描述語法可能非常復雜-如果有人在屬性中放置非字母數字字符(例如&符)怎么辦? 您可以通過將字符集設置為“除引號字符之外的任何字符”來捕獲引號之間的所有輸入,因此“ '[^']*' ”通常可以做正確的事情。 通常,您也需要記住轉義符(例如,使用字符串'Mary\\'s lamb'您實際上確實想捕獲中間的撇號,因此簡單的“除了撇號”的字符集不會刪減它)幸運的是,根據規范,這不是XML / HTML的問題。

盡管如此,如果有一個現有的庫可以為您提取數據,那么它可能比滾動自己的庫更快,更正確,因此,如果可能的話,我會傾向於這樣做。

我對PowerGrep不熟悉,但是您的正則表達式不完整。 嘗試這個:

title='[a-zA-Z0-9 ]*'

或更好:

title='([^']*)'

我將使用此正則表達式來獲取title屬性值

<[a-z]+[^>]*\s+title\s*=\s*("[^"]*"|'[^']*'|[^\s >]*)

請注意,此正則表達式將屬性值表達式與引號匹配。 因此,如果需要,您必須將其刪除。

這是您需要的正則表達式

title='([a-zA-Z0-9]+)'

但是如果您打算做更多這樣的事情,使用解析器可能會使它更加健壯和有用。

嘗試以下方法:

title=\'[a-zA-Z0-9]*\'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM