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



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

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

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

只会改变"甜蜜"的第一个实例。

同样地

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

仅在类属性中处理"甜蜜"。

嗯,最明显的答案是:

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

相关内容

  • 没有找到相关文章

最新更新