[英]Using Regular Expression to capture text within font tag
我需要創建一個正則表達式來捕獲字體字段之間的文本並將其存儲為javascript變量。
<TD class="example">
<font>
I need this information captured
</font>
</TD>
我發現了一些顯示該正則表達式的示例:
<b>(.*?)</b>
可以使用以下HTML:
blah <b>one</b> blah blah <b>two</b>YO!
所以我不明白為什么這樣:
<font>(.*?)</font>
找不到這個:
<font>
I need this information captured
</font>
<font>(.*?)</font>
不起作用,因為該點不能與換行符匹配,因此必須將其替換為[\\s\\S]
<font>([\s\S]*?)</font>
注意:在您的代碼中,請不要忘記轉義斜線
如果要查找作為<font>
<td class="example">
的后代的<font>
標記,則將獲得更復雜的模式,因為必須確保始終位於<td>
:
<td class="example">(?:(?=([^<]+|<(?!\/td>|font)))\1)*<font>([\s\S]*?)<\/font>
僅當您的<td>
標記在<font>
標記之前不包含其他<td>
標記時,此模式才有效。
圖案細節:
此部分在<font>
標記之前描述了允許的內容:
(?: # open a non capturing group
(?= # open a lookahead
( # open the capture group 1
[^<]+ # all that is not a <
| # OR
<(?!\/td>|font) # a < not followed by /td> or font
) # close capture group 1
) # close the lookahead
\1 # backreference to capture group 1
)* # close the non capturing group
. 這是模仿原子組 (?>...)
(?>...)
一種技巧。 這是一個不允許正則表達式引擎回溯的組。 此功能之所以必要,是因為簡單的子模式(?:[^<]+|<(?!\\/td>|font))*
例如(?:[^<]+|<(?!\\/td>|font))*
可能會導致災難性的回溯 。
這個技巧利用了這樣一個事實,即前瞻斷言的內容自然是原子的。 內容在前瞻內部的捕獲組中進行了描述,並且在前瞻的右括號后對捕獲組進行了反向引用。 \\1
表示一勞永逸的捕獲,可以毫無問題地重復它。
我知道您要求使用正則表達式,但是正則表達式不是解析HTML的合適工具。 jQuery將使查詢變得非常簡單。
$("TD.example > font").text()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.