0

以下のコード (私の Web サイトのユーザーが新しいブログ投稿を作成するたびに貼り付けます) の 300 という数字の 4 つのインスタンスすべてを 470 に置き換えたいと思います。

<div>
  <object width="300" height="300">
    <embed src="link-removed" width="300" height="300"></embed>
  </object>
  <p>
    <a href="another-link">link</a>
  </p>
</div>

貼り付けるコードの幅と高さは、必ずしも 300 x 300 になるとは限りません。

したがって、数値を囲む引用符を考慮することを忘れないで、文字列「width =」と「height =」に続く数値を表す正規表現がおそらく必要だと思います。それが最善の方法であるかどうかを誰かに教えてもらえますか?もしそうなら、最良の正規表現は何でしょうか?

重要な場合、貼り付けられるコードは、文字列ではなく「テキスト」としてデータベースに保存されます。これは、非常に長いためです (ここに貼り付けられているものから数百文字を削除しました)...

4

1 に答える 1

5

を見つけ(width|height)="\d+"て置き換えることができます$1="470"。これは、widthまたはheightをグループ 1 にキャプチャし、置換文字列で、このキャプチャされた文字列を として参照します$1

要件によっては、パターンがより複雑になる場合があります。空白を自由に使いたい場合は、 ;\s*の周りを許可できます。=一致を防ぐために、たとえば、tablewidth="300"パターンの前に\bなどを付けることができます。

こちらもご覧ください


グループのキャプチャについて

コンストラクトは、(...)「キャプチャ グループ」と呼ばれるものです。

このテスト文字列が与えられた場合:

i have 35 dogs, 16 cats and 10 elephants

次に(\d+) (cats|dogs)、2 つの一致結果が得られます ( rubular.com を参照) 。

  • 結果 1:35 dogs
    • グループ 1 のキャプチャ35
    • グループ 2 のキャプチャdogs
  • 結果 2:16 cats
    • グループ 1 のキャプチャ16
    • グループ 2 のキャプチャcats

参考文献


ルビーで

置換文字列では、Ruby はキャプチャ グループへの後方参照の\代わりに$sigil を使用します。

ruby-doc.org --String#gsub : 文字列が置換として使用される場合、パターン マッチが開始する前に文字列への置換が行われるため、マッチの特殊変数 ( $&and など$1) をそれに置換することはできません。ただし、シーケンス\1\2などを使用して、一致する連続するグループを補間することができます。

したがって、探しているソリューションは次のようなものです。

text = 'blah blah width="300" and height="299" more blah'
puts text.gsub(/(width|height)="\d+"/, '\1="470"')

これは出力します ( ideone.com で見られるように):

blah blah width="470" and height="470" more blah
于 2010-06-09T11:37:37.393 に答える