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