>> "<img src=\"https://filin.mail.ru/pic?width=90&height=90&email=multicc%40multicc.mail.ru&version=4&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进行测试时应该捕获此字符串,实际上并非如此。
答案 0 :(得分:2)
正则表达式是99.9%的时间处理HTML(或XML)的错误工具。相反,请使用解析器,例如Nokogiri:
require 'nokogiri'
html = '<img src="https://filin.mail.ru/pic?width=90&height=90&email=multicc%40multicc.mail.ru&version=4&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"}
答案 1 :(得分:0)
当你在Regex上调用match时,它工作正常,但我强烈建议你不要使用正则表达式来解析HTML。
str = '<img src="https://filin.mail.ru/pic?width=90&height=90&email=multicc%40multicc.mail.ru&version=4&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&height=90&email=multicc%40multicc.mail.ru&version=4&build=7\" style=\"\">"
答案 2 :(得分:0)
这对我有用:
'<img src="https://filin.mail.ru/pic?width=90&height=90&email=multicc%40multicc.mail.ru&version=4&build=7" style="">'.match(/<img src="https?:\/\/(?:\w+\.)+\w{1,5}.+?"(?: style=".+")?>/)
不确定为什么你的确无法正常工作,虽然我注意到你忘了逃脱匹配字符串中的最后两个双引号。我用单引号来避免这个问题