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



我在 HTML/XML 中有以下行:

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

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

<psclass="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"标签?

使用惰性模式在字符串中查找">"的第一个实例:

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

在这里测试它: https://regex101.com/r/Lz7GT0/1

如果要在同一字符串中处理多个匹配项,则只需使用有状态解析器并多次调用匹配项即可。

在这里尝试一下: http://jsfiddle.net/jarn851m/

总而言之,由于有很多"这不应该使用正则表达式完成"的热量,这就是解决方案。 原始 XML:

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

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

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

请注意使用 ^ 运算符,当 XML 更改为以下运算符时,该运算符将失败:

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

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

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

请注意 ^ 运算符的删除和 ? 运算符的引入,这是主要区别。 删除 ^ 会查找任何内容,直到一个开放的尖括号,即 ?运算符阻止正则表达式贪婪,并在找到的第一个打开的尖括号上停止匹配。

真棒不是吗? 人们一直在努力将XML解析器用于如此简单和超快的东西!

最新更新