使用正则表达式解析有限的HTML / XML但使用嵌入式标记

时间:2017-08-07 15:51:36

标签: html regex

我在HTML / XML中有以下行:

<p class="myText" style="...">some text here</p>

我使用以下正则表达式捕获'p'标签内的内容:

<p\sclass=\"myText\"[^>]*>([^<]*)</p>

直到今天,当下面的HTML / XML在'p'标签中有一些嵌入的'i'和'b'标签时才有效,如下例所示:

<p class="myText" style="...">some <b style="...">bold</b> and <i>italic</I> text here</p>

如何修改正则表达式以获取最后一个样本中'p'标记内的内容,包括'b'和'i'标记?

2 个答案:

答案 0 :(得分:3)

使用lazy mode查找“&gt;”的第一个实例在你的字符串中:

<p.+?>(.*)<\/p>

在此测试: https://regex101.com/r/Lz7GT0/1

如果你想在同一个字符串中处理多个匹配,你需要做的就是use a stateful parser and call match multiple times

在这里试试: http://jsfiddle.net/jarn851m/

答案 1 :(得分:1)

总而言之,由于存在大量热量“这不应该使用正则表达式”,这就是解决方案。原始XML:

<p class="myText" style="...">some text here</p>

解决它的原始正则表达式:

<p\sclass=\"myText\"[^>]*>([^<]*)</p>

请注意使用^运算符,当XML更改为:

时失败
<p class="myText" style="...">some <b style="...">bold</b> and <i>italic</i> text here</p>

因此解决方案正则表达式是:

<p\sclass=\"myText\".+?>(.*?)<\/p>

请注意消除^运算符并引入?运营商,这是主要的区别。删除^找到任何东西,直到一个开放的角括号,?操作员阻止正则表达式贪婪并在找到的第一个打开的角括号上停止匹配。

真棒吗?人们一直在努力将XML解析器放到如此简单和超级快速的东西中!