【问题标题】:Regex (Ruby) to capture object name and id number正则表达式(Ruby)捕获对象名称和 ID 号
【发布时间】:2014-11-19 17:39:30
【问题描述】:

例如,我有两个潜在的标记:

<iframe src="http://embed.app.com/packages/495" width="850" height="480" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

<iframe src="https://embed.app.com/videos/10332?hide_text=1&amp;buy_btn=0&amp;autoplay=0" width="960" height="540" class="responsive-embed"></iframe>

我希望使用 Ruby 匹配,无论是用于 video 还是 package 以及它的 :id 号码

非常感谢任何帮助!

【问题讨论】:

标签: html ruby regex


【解决方案1】:

仅在使用过 XML 解析器后才使用正则表达式。否则https://stackoverflow.com/a/1732454/1916721

一旦你得到了 src 属性,你就可以用这个快速的正则表达式解析链接:

https?:\/\/embed\.app\.com\/((?:packages)|(?:videos))\/([0-9]+)

然后您将在第一个捕获组中获得packagesvideos(您可以随意修剪s。在第二个捕获组中您将获得id

示例见这里:http://regex101.com/r/uF4bI1/2

【讨论】:

  • 如果您已经在使用 XML 解析器,那么为什么不使用 URI 或 Addressable 来解析 URL?
  • @muistooshort 他们要求正则表达式,所以我给了他们正则表达式。这可能是更好的选择,虽然好点
【解决方案2】:
^.*?\/(?=packages|videos).*?\/(\d+)

试试这个。查看演示。

http://regex101.com/r/qC9cH4/1

【讨论】:

  • 到目前为止,这与 ID 号码匹配...如果我不知道我正在解析哪个 html,如果它是 VideoPackage,我将如何匹配?抱歉,我在正则表达式和截止日期方面很糟糕。谢谢!
  • @chhhris 也只需添加它们。(?=packages|videos|Video|Package) 你就可以滚动了
  • 感谢@vks,澄清一下,我的意思是在两个示例标记之间,我怎样才能使匹配值等于packagesvideos 而不是:id。例如我得到了这个工作:rubular.com/r/HJ6TxYpOEO
  • @chhhris 没找到你。你已经有videopackage 的匹配项。你想要video id 吗?
  • @chhhris 试试^.*?\/(?=packages?|videos?).*?\/(\d+)
【解决方案3】:

使用 nokogiri 查找 iframe 标签中的 src 属性和提取信息的模式的示例:

require 'nokogiri'

html_doc = <<EOD
<iframe src="http://embed.app.com/packages/495" width="850" height="480" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<iframe src="https://embed.app.com/videos/10332?hide_text=1&amp;buy_btn=0&amp;autoplay=0" width="960" height="540" class="responsive-embed"></iframe>
EOD

puts "Type         ID\n----------------------"
doc = Nokogiri::HTML.parse(html_doc)
srcList = doc.xpath('//iframe/@src')
srcList.each do |src| 
    if ( m = src.to_s.match(/\/(?<type>packages|videos)\/(?<id>[0-9]+)/) )
        printf("%-12s %s\n",m[:type], m[:id])
    end
end

【讨论】:

    【解决方案4】:

    在红宝石中,正则表达式是

    /iframe src="http:\/\/[^\/]+\/[packages|videos]+\/([^"]+)"/
    

    【讨论】:

      【解决方案5】:

      Ruby 2.0 支持\K。所以你可以使用下面的正则表达式,

      <iframe src="https?:\/\/[^\s]*?\/\K(?:videos|packages)\/\d+
      

      DEMO

      如果你不想匹配 id 那就用这个,

      <iframe src="https?:\/\/[^\s]*?\/\K(?:videos|packages)
      

      DEMO

      这将在两个单独的组中捕获两者。

      <iframe src="https?:\/\/[^\s]*?\/\K(videos|packages)\/(\d+)
      

      DEMO

      【讨论】:

      • 最后一个正是我要找的!
      猜你喜欢
      • 2015-01-20
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2020-10-07
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      相关资源
      最近更新 更多