我有两个HTML字符串:
a="<div> foo: <span>bar</span> </div>"
b="<div> foo: bar <br> </div>"
我想从每个字符串中找到foo: bar
。
我想要做的就是从'foo'这个词中找到,直到我遇到'&lt;'字符。
我可以使用正则表达式执行此操作:
foo([^(<)]+)
这只会从字符串b
中找到“foo:bar”,但不能从字符串a
中找到,因为<span>
标记会阻碍它。因此,我想编写正则表达式,从foo
开始查找,直到找到忽略<
标记的<span>
字符。
这些只是其必须处理的一些字符串,因此它必须像状态一样工作,即我无法在等之前或之后开始删除标记。
基本上我需要知道的是如何找到字符串中的所有字符,直到遇到某个字符,除非该字符后跟一组指定的字符,即直到找到<
但是{if { {1}}之后是<
,然后查找下一个span>
。
有谁知道怎么做?
答案 0 :(得分:1)
虽然使用regexp来解决HTML问题通常很糟糕,但你可以用这种方式解决问题:
foo, bar = string.gsub(/<.*?>/, '').strip.split
编辑:嗯,那么你可能想要看看正则表达式的负面展望:(?!regpattern)
string[/(foo.*)<((?!span|\/span))/,1]
# match foo followed by all character until < unless the character after that is /span or span
答案 1 :(得分:1)
您不希望使用正则表达式处理HTML有很多很多原因。您的示例文本非常简单,但是在实际使用中很可能HTML会更复杂和变量,这将导致基于正则表达式的解决方案变得非常脆弱。
相反,从正确的工具开始并使用解析器:
require 'nokogiri'
[
"<div> foo: <span>bar</span> </div>",
"<div> foo: bar <br> </div>"
].each do |str|
doc = Nokogiri::HTML::DocumentFragment.parse(str)
puts doc.at('div').text
end
哪个输出:
foo: bar foo: bar
这使用Nokogiri,它是一个非常强大的XML / HTML解析器,并且是Ruby的标准XML / HTML解析器。