【问题标题】:With regex how do i match between an XML tag multiple times?使用正则表达式,我如何多次匹配 XML 标记?
【发布时间】:2010-12-03 00:29:30
【问题描述】:

首先,在你说什么之前,我必须这样做,因为 RSS 格式不正确,但我无法最终纠正它。所以,当我尝试使用 RSS 和 XML 解析器时,它们失败了,我只有前端访问权限。但是,我非常接近,但我不知道为什么这不匹配。

Feed(它是 long 1 行字符串): http://pastebin.com/5dJhXCvf

第一个例子:

<title>(.+)</title>

我认为这对我的 just 测试很有效:

<title>&quot;cterrorism task force&quot; location:oregon - Google News</title>

但问题是它匹配所有内容然后作为一个匹配例如:

<title>&quot;cterrorism task force&quot; location:oregon - Google News</title><title>&quot;cterrorism task force&quot; location:oregon - Google News</title>

等于我的数组中来自 exec()match() 的 1 个结果项

所以我尝试了:

<title>([\w\d\s\=\%\_\`\~\+\!\@\#\$\%\^\&\*\(\)\:\'\"\[\]\{\}\|\,\.\/]+)</title>

但这没有任何回报......有什么想法吗?

【问题讨论】:

  • Feed 的格式有什么问题?
  • 如果您将其复制并粘贴到 W3C 验证器中,它将失败。 jQuery 甚至也不会尝试解析它。我也尝试过 jFeed,但也没有用。但是,如果我用文本 HEADER 调用它,它会返回正常。我只需要标题和链接,所以我想我可以解析为文本然后使用正则表达式。
  • 你的角色职业少了几个角色,这对于这样的怪物来说是不可避免的。如果您想要一个匹配除尖括号以外的任何字符的字符类,请使用:[^&lt;&gt;]
  • 朋友不要让朋友用正则表达式解析XML。
  • @orangepips 我知道,我知道,但它字面意思是给市长的,这是他给我使用的 XML。

标签: javascript xml regex parsing rss


【解决方案1】:

尝试非贪婪版本&lt;title&gt;(.+?)&lt;\/title&gt;Here你可以在线测试这些东西。

【讨论】:

  • /&lt;title&gt;(.+?)&lt;\/title&gt;/g 很棒,但它只返回 2 个结果。你知道为什么会这样吗?我相信应该有 9...
  • 不确定。你的文字中是否有新行?
  • 不应该...但可能有
  • 也许它不能正确处理\n。目前我没有任何其他想法。尝试添加m 和/或i 标志。
  • @Oscar 试试&lt;title&gt;([^&lt;]+?)&lt;/title&gt;
【解决方案2】:

您发布的 RSS 是格式正确的 XML,但不是有效的 RSS(根据 W3C 提要验证器)。由于它格式正确,您最好的选择仍然是使用 XML 解析器,而不是使用正则表达式。事实上,大多数 RSS 解析器也应该没问题,因为 RSS 因存在验证问题而臭名昭著(部分原因是早期的规范不佳),因此任何值得使用的 RSS 解析器都不应该有任何验证问题的麻烦W3C 验证器正在报告。

顺便说一句,这看起来像 Google 新闻提要。您可以通过将输出参数从“rss”更改为“atom”来获得有效的 Atom。例如:

http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=h&num=3&output=atom

Google 的生成提要的服务通常在生成 Atom 而不是 RSS 方面做得更好。也就是说,您可能还想向 Google 报告无效的 RSS。

【讨论】:

    【解决方案3】:

    尝试一个惰性量词:

    <title>([^<]+?)</title>
    

    【讨论】:

      【解决方案4】:

      通过添加 U 标志尝试不贪婪的表达式:

      "/<title>(.+)</title>/U"
      

      这告诉它匹配最小的匹配而不是可用的最大匹配。

      【讨论】:

        【解决方案5】:

        许多解析器可以处理与规范的轻微偏差。任何与出色的libxml2 库的绑定都能够处理格式不正确的XML。许多语言都有绑定。例如,下面的 Ruby sn-p 可以很好地解析它:

        require 'nokogiri'
        
        xml = open('rss.txt').read
        doc = Nokogiri::XML.parse(xml)
        doc.xpath('//title').each do |title|
          puts title.inner_text
        end
        

        结果:

        "joint terrorism task force" location:oregon - Google News
        "joint terrorism task force" location:oregon - Google News
        Federal and FBI Joint Terrorism Task Force are still flawed - OregonLive.com
        Striking a fair balance - OregonLive.com
        Blame the terrorists, not the FBI - Portland Tribune
        Why Oregon? Why not?: Terrorism can strike anywhere - The Register-Guard
        INDIVIDUAL TRAVEL UNDER ATTACK - NewsWithViews.com
        The other terrorism-and pondering Portland - BlueOregon
        Fla. dance troupe causes scare at Lincoln Tunnel - Northwest Cable News
        

        编辑:根据您的 cmets,我看到您正在使用 jQuery。您应该能够使用 jQuery XML 解析器来提取标题(以及其他部分,根据需要)。

        【讨论】:

        • jQuery XML 解析器静默失败。当被解析为 XML 时,我在 Web 检查器中返回 XML,但实际返回的值是 null。如果我在原始文本中要求它,它会很好地返回。这就是我正则表达式的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2013-08-09
        • 1970-01-01
        • 2015-09-19
        相关资源
        最近更新 更多