【问题标题】:Using regular expression to parse limited HTML/XML but with embedded tags使用正则表达式解析有限的 HTML/XML,但嵌入标签
【发布时间】:2018-01-15 00:02:59
【问题描述】:

我在 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”标签?

【问题讨论】:

  • 有效:是的。好主意:不。使用 HTML 解析器。您将获得可以阅读的代码,这些代码将更健壮且更易于维护。
  • 公平,但这并不能回答如何用正则表达式解决它的好奇心......这是最初的问题。我相信它可以做到!
  • 为什么会有人对此投票?
  • 我同意@Quentin。 yms 的解决方案至少现在应该可以解决您的问题,但是如果您正在寻找更强大的解决方案,那不是这样。我建议评估 xpath 的使用,这是一个很好的工具。

标签: html regex


【解决方案1】:

使用lazy mode 在您的字符串中查找“>”的第一个实例:

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

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

如果您想在同一个字符串中处理多个匹配项,您只需use a stateful parser and call match multiple times

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

【讨论】:

  • 谢谢你,很好的尝试,问题(我没有解释它的错)是API的内容是一个多于一个'p'标签的字符串,所以像这样:

    一些 bolditalic text here

    带有更多文本和其他 XML 代码不重要然后

    其他文字

  • 只需使用(.*?) 而不是贪婪版本(.*) 以确保匹配在找到第一个&lt;/p&gt; 时结束,而不是遍历整行(如果正则表达式是多行则为文本) 直到找到最后一个 &lt;/p&gt;
【解决方案2】:

总而言之,由于有很多“不应该使用正则表达式”的热度,这就是解决方案。原始 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 解析器来实现如此简单和超快速的东西!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多