【问题标题】:Can't manage to write regex for this [duplicate]无法为此编写正则表达式[重复]
【发布时间】:2011-08-12 13:46:16
【问题描述】:

可能重复:
What RSS parser should I use in PHP?

代码如下:

<item>
<title><![CDATA[OLK: The statement of shareholders for shares sale and for shares purchase]]></title>
<link>http://www.nasdaqomxbaltic.com/market/?pg=news&amp;news_id=250910</link>
<description><![CDATA[<pre></pre>]]></description>
<pubDate>2011-08-12 16:25:00</pubDate>
<guid>250910</guid>
</item>
<item>
<title><![CDATA[ZMP: Pranešimas apie sandorius susijusį su emitento vertybiniais popieriais]]></title>
<link>http://www.nasdaqomxbaltic.com/market/?pg=news&amp;news_id=250907</link>
<description><![CDATA[<pre></pre>]]></description>
<pubDate>2011-08-12 16:12:00</pubDate>
<guid>250907</guid>
</item>

我需要获取介于&lt;title&gt;&lt;![CDATA[: 之间的值OLK、ZMP。在 php regex 中执行此操作的最快和最有效的方法是什么?为什么CDATA在这里? 注意:我也得到了 news_id=。

【问题讨论】:

  • 不要为此使用正则表达式,使用适当的 XML 解析器
  • 是更快还是更简单?因为我只需要速度。
  • @austin 接受的答案是错误的。由于所有现代语言都使用 PCRE,因此 Regex 可以很好地解析 HTML。请不要再链接到答案。不使用正则表达式解析 X(HT)ML 的唯一原因是因为有现成的解析器可用,并且它们比脆弱的正则表达式更健壮和可靠。
  • 只是出于好奇,为什么不使用 XML 解析器,这样您就可以只获取您正在寻找的元素,而不必担心整个文档。

标签: php regex cdata


【解决方案1】:

您应该使用 XML 解析器(例如SimpleXML)来访问标签内容,然后对标签的内容使用正则表达式。

这是最有效的解决方案,因为:

  • XML 解析器是解析 XML 文档的最有效方式,
  • 如果你真的需要使用正则表达式,你应该在CDATA中包含的数据上使用它,

当涉及到您关于CDATA 的部分问题时,您可以查看有关它的更多信息here

【讨论】:

    【解决方案2】:

    这是一个很好的使用 php 正确解析 xml 的指南。 http://www.kirupa.com/web/xml_php_parse_beginner.htm这是我开始使用php时用来弄清楚xml解析器是如何工作的。

    【讨论】:

      【解决方案3】:

      考虑使用 XML 解析器,CDATA allows you to use special characters inside the value. 如果您坚持使用正则表达式,请尝试以下操作:

      /<title><!\[CDATA\[OLK:\s*(.*?)\]\]/
      

      【讨论】:

        【解决方案4】:

        如果你真的想使用正则表达式,那么我会推荐前瞻和后瞻零宽度断言。它们允许您将状态和表达式作为匹配的开始和结束,但不会包含在结果中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-11
          • 1970-01-01
          • 1970-01-01
          • 2014-12-16
          • 2011-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多