簡體   English   中英

對抓取HTML標簽正則表達式模式感到困惑

[英]Confused about Grabbing HTML Tags regex pattern

我正在閱讀regular-expressions.info示例,以嘗試了解更多正則表達式模式。

第一個示例Grabbing HTML Tags討論了用於特定HTML標簽的開始和結束對的正則表達式。

<TAG\b[^>]*>(.*?)</TAG>

我在這里有點困惑。 為什么將\\b[^>]*添加到上述正則表達式模式中,而通過使用以下正則表達式模式可以實現相同的目的:

<TAG>(.*?)</TAG>

為什么要使用這種額外的正則表達式模式? 它對性能有幫助嗎?

  • 這是為了匹配<a href=...> stuff </a>類的<a href=...> stuff </a> ,而不是簡單的<b> stuff </b> ,在該地方您的選項將起作用。
  • 為了避免匹配<attribute ...> stuff </a>類的東西,需要\\b邊界
  • 惰性量詞.*? [^<]*相反,需要在開始和結束標簽之間插入,因為在開始和結束標簽之間您可能會有另一個標簽(例如<b>

因為沒有單詞邊界,它不僅匹配標簽,而且匹配所有內容。

DEMO

您可以嘗試演示。 只需在模式中使用\\b

<TAG\b[^>]*>(.*?)</TAG>

說明:

  • <匹配<符號。
  • TAG標簽名稱
  • \\b在單詞字符和非單詞字符之間匹配。
  • [^>]*匹配不>零或更多次的任何字符。
  • (.*?)捕獲開始和結束標記內的部分。 ? *后不願進行匹配。
  • </TAG>匹配結束標簽。

例如:

輸入:

<a href="www.foo.com">link</a>
<ahref="www.foo.com">link</a>

正則表達式:

<a[^>]*>(.*?)<\/a>

上面的正則表達式將匹配兩個鏈接。

正則表達式:

<a\b[^>]*>(.*?)<\/a>

但這將與第一個匹配,因為a和第一個space字符之間存在單詞邊界。

一些開始標簽具有諸如<img src="asdf.png">類的屬性。 直到到達> ,標簽才結束,因此單詞src="asdf.png"和non- >字符匹配src="asdf.png"

\\b[^>]*

<TAG\b[^>]*>(.*?)</TAG>

正則表達式可視化

Debuggex演示

允許在開放標記中包含文本(例如參數: width="30" )和空格(只要它只是一個TAG而不是TAGX或其他某種類型-這就是\\b 字邊界 ) 。 html中的語法和間距非常松散。 允許額外的參數和空格始終是安全的,因為單個html標簽可以跨越多行。

后者正則表達式

<TAG>(.*?)</TAG>

正則表達式可視化

Debuggex演示

僅允許開始標簽精確地是 <TAG>然后是“可能跨越多行的某些文本”,然后是</TAG>

? .*? 不情願 ,意味着下一個收盤</TAG>是唯一可以匹配的收盤</TAG> 消除? 將其更改為greedy ,這意味着匹配搜索字符串中的最后一個</TAG>


確保檢查出堆棧溢出正則表達式常見問題解答 :)

暫無
暫無

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

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