我需要检查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
答案 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