使用正则表达式捕获字体标记内的文本

时间:2014-02-26 18:11:42

标签: javascript regex

我需要创建一个正则表达式来捕获字体字段之间的文本并将其存储为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>

2 个答案:

答案 0 :(得分:3)

<font>(.*?)</font>不起作用,因为点无法匹配换行符,您必须将其替换为[\s\S]

<font>([\s\S]*?)</font>

注意:在您的代码中,不要忘记转义斜杠

如果您想找到<font>的后代<td class="example">标记,则会获得更复杂的模式,因为您必须确保始终位于<td>:< / p>

<td class="example">(?:(?=([^<]+|<(?!\/td>|font)))\1)*<font>([\s\S]*?)<\/font>

仅当<td>标记在<td>标记之前不包含其他<font>标记时,此模式才有效。

模式细节:

此部分介绍<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

这是模仿atomic group (?>...) (javascript中没有的功能)的技巧。这是一个不允许正则表达式引擎回溯的组。此功能在此处是必需的,因为像(?:[^<]+|<(?!\/td>|font))*这样的简单子模式可能会导致catastrophic backtracking

诀窍使用lookahead assertion的内容是自然原子的事实。内容在前瞻内部的捕获组内描述,并且在前瞻的右括号之后对捕获组进行反向引用。 \1指的是一次性修复的捕获,您可以毫无问题地重复它。

答案 1 :(得分:0)

我知道您要求使用正则表达式,但正则表达式不适合解析HTML。 jQuery会查询非常简单。

$("TD.example > font").text()