0

HTMLフラグメントをチェックし、HTML要素のIDまたはクラスを他の値に置き換える必要があります。正規表現を使用することは私のニーズに合いません。テキスト内で検索対象のクラスが複数回出現する可能性があるため、これを保持する必要があります。

たとえば、私はこのHTMLを持っています:

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

'bitter'に置き換える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>

2番目の例からこれを取得するにはどうすればよいですか?:

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

class 属性内でのみ「sweet」を処理します。

于 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 に答える