正则表达式找到字符?

时间:2013-11-27 13:43:25

标签: ruby regex

我有两个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>

有谁知道怎么做?

2 个答案:

答案 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解析器。