0

我想用 470 替换下面代码中数字 300 的所有 4 个实例(我的网站用户在创建新博客文章时将粘贴这些实例)。

<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 回答