0

我需要检查一个 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
4

2 回答 2

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}'" }

仅在类属性中处理“甜蜜”。

于 2012-12-11T22:35:04.693 回答
0

嗯,最明显的答案是:

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

str['sweet'] = 'bitter'
puts str
于 2012-12-11T21:53:19.540 回答