用Ruby中的一个标记替换顺序重复标记

时间:2011-02-18 06:02:40

标签: ruby regex

我正在尝试使用Ruby只用一个<br>标记替换多个连续的<br>标记。

例如:

Hello
<br><br/><br>
World!

会变成

Hello
<br>
World!

1 个答案:

答案 0 :(得分:4)

可以使用正则表达式执行此操作,例如:

 "Hello\n<br><br/><br>\nworld".gsub(/(?im)(<br\s*\/?>\s*)+/,'<br>')

要解释一下:(?im)部分有选项,表明匹配应该不区分大小写,.应匹配换行符。分组表达式(<br\s*\/?>\s*)匹配<br>(可选地带有空格和尾随/)可能后跟空格,而+表示匹配该组中的一个或多个。 / p>

但是,我应该指出,通常使用正则表达式来操作HTML并不是一个好主意 - 你应该使用正确的解析器。例如,这是使用Nokogiri执行此操作的更好方法:

require 'nokogiri'

document = Nokogiri::HTML.parse("Hello
<br><br/><br>
World!")

document.search('//br').each do |node|
    node.remove if node.next.name == 'br'
end

puts document

这将产生如下输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hello
<br>
World!</p></body></html>

(解析器将您的输入转换为格式良好的文档,这就是您拥有DOCTYPE并附上<html><body><p>标记的原因。)