-5
>> "<img src=\"https://filin.mail.ru/pic?width=90&amp;height=90&amp;email=multicc%40multicc.mail.ru&amp;version=4&amp;build=7\" style="">".match(Regexp.new("<a href=\"http(s?):\/\/(?:\w+\.)+\w{1,5}.+?\">|<img src=\"http(s?):\/\/(?:\w+\.)+\w{1,5}.+?\"(?: style=\".+\")?>"))
=> nil

但是在 Rubular 中的测试表明它应该被捕获

关联

我不明白为什么用 Rubular 进行测试说应该捕获这个字符串,而实际上不是。

4

3 回答 3

2

正则表达式在 99.9% 的情况下都不是处理 HTML(或 XML)的错误工具。相反,请使用解析器,例如Nokogiri

require 'nokogiri'

html = '<img src="https://filin.mail.ru/pic?width=90&amp;height=90&amp;email=multicc%40multicc.mail.ru&amp;version=4&amp;build=7" style="">'
doc = Nokogiri::HTML(html)

url = doc.at('img')['src'] # => "https://filin.mail.ru/pic?width=90&height=90&email=multicc%40multicc.mail.ru&version=4&build=7"
doc.at('img')['style'] # => ""

一旦你检索到你想要的数据,比如src,使用另一个“正确”的工具,比如URI

require 'uri'

scheme, userinfo, host, port, registry, path, opaque, query, fragment = URI.split(url)
scheme    # => "https"
userinfo  # => nil
host      # => "filin.mail.ru"
port      # => nil
registry  # => nil
path      # => "/pic"
opaque    # => nil
query     # => "width=90&height=90&email=multicc%40multicc.mail.ru&version=4&build=7"
fragment  # => nil

query_parts = Hash[URI.decode_www_form(query)]
query_parts # => {"width"=>"90", "height"=>"90", "email"=>"multicc@multicc.mail.ru", "version"=>"4", "build"=>"7"}
于 2013-07-31T15:04:55.377 回答
0

当您在 Regex 上调用 match 时,它可以正常工作,尽管我强烈建议您不要使用 regex 来解析 HTML。

str = '<img src="https://filin.mail.ru/pic?width=90&amp;height=90&amp;email=multicc%40multicc.mail.ru&amp;version=4&amp;build=7" style="">'

matchData = /<img src="http(?:s?):\/\/(?:\w+\.)+\w{1,5}.+?"(?: style=".+")?>/.match(str)

p matchData[0] # => "<img src=\"https://filin.mail.ru/pic?width=90&amp;height=90&amp;email=multicc%40multicc.mail.ru&amp;version=4&amp;build=7\" style=\"\">"
于 2013-07-31T14:54:27.580 回答
0

这对我有用:

'<img src="https://filin.mail.ru/pic?width=90&amp;height=90&amp;email=multicc%40multicc.mail.ru&amp;version=4&amp;build=7" style="">'.match(/<img src="https?:\/\/(?:\w+\.)+\w{1,5}.+?"(?: style=".+")?>/)

不知道为什么你的不完全工作,虽然我注意到你忘记转义匹配字符串中的最后两个双引号。我使用单引号来避免这个问题

于 2013-07-31T14:58:26.657 回答