如何替换HTML片段中HTML元素的id或类?

时间:2012-12-11 21:20:28

标签: ruby parsing html-parsing nokogiri

我需要检查HTML片段并用其他值替换HTML元素的id或类。使用正则表达式并不符合我的需要,因为在文本中可能会出现多次搜索的类,我应该保留它。

例如,我有这个HTML:

<div id='sweet'>
  Bla bla sweet bla bla...
</div>

当我用'苦涩'替换id='sweet'时,我希望收到:

<div id='bitter'>
  Bla bla sweet bla bla...
</div>

我可以毫无问题地使用Nokogiri,但有时我会得到无效的HTML并需要按原样返回标记。问题是,Nokogiri修复了标记和破坏的节点。

示例:

</table>
<div id='sweet'>
  Bla bla sweet bla bla...
</div>

我只会收到这个:

<div id='bitter'>
  Bla bla sweet bla bla...
</div>

示例2:

</div>
<div id='sweet'>
  Bla bla sweet bla bla...
</div>
<table>
  <tr>
    <td>
      Some text

我会得到这个:

<div id='bitter'>
  Bla bla sweet bla bla...
</div>
<table>
  <tr>
    <td>
      Some text
    </td>
  </tr>
</table>

我如何从第二个例子中得到这个?:

</div>
<div id='bitter'>
  Bla bla sweet bla bla...
</div>
<table>
  <tr>
    <td>
      Some text

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式,但需要更多上下文:

str = "</div>
<div id='sweet'>
  Bla bla sweet bla bla...
</div>
<table>
  <tr>
    <td>
      Some text"

str.sub /id='sweet'/, "id='bitter'"

只会更改'sweet'的第一个实例。

同样,

str = "</div>
<div class='cls1 sweet cls3'>
  Bla bla sweet bla bla...
</div>
<table>
  <tr>
    <td>
      Some text"

puts str.sub( /class=['"]([^'"]*)sweet([^'"]*)['"]/ ) { "class='#{$1}bitter#{$2}'" }

仅在类属性中处理'sweet'。

答案 1 :(得分:0)

嗯,最明显的答案是:

str = <<EOF
</div>
<div id='sweet'>
  Bla bla sweet bla bla...
</div>
<table>
  <tr>
    <td>
      Some text
EOF

str['sweet'] = 'bitter'
puts str