【问题标题】:Regex for HTML attribute replacement/addition用于 HTML 属性替换/添加的正则表达式
【发布时间】:2008-12-11 14:49:38
【问题描述】:

我正在寻找执行以下操作的单行正则表达式:

给定一个带有“name”属性的 HTML 标记,我想用我自己的属性替换它。如果该标签缺少名称属性,我想植入我自己的属性。结果应如下所示:

<IMG name="img1" ...> => <IMG name="myImg1" ...>
<IMG ...> => <IMG name="myImg1" ...>

这可以用单行正则表达式完成吗?

【问题讨论】:

  • 您使用 Perl、Java、awk 等哪个正则表达式?
  • Perl。但是 Python/awk/egrep 也一样好。

标签: html regex


【解决方案1】:

诀窍是匹配每个完整的“attribute=value”对,但捕获只匹配属性名称不是“name”的那些。然后插入您自己的“名称”属性以及所有捕获的属性。

s/<IMG
  ((?:\s+(?!name\b)\w+="[^"]+")*)
  (?:\s+name="[^"]+")?
  ((?:\s+(?!name\b)\w+="[^"]+")*)
  >
 /<IMG name="myName"$1$2>
 /xg;

【讨论】:

  • 这是一个比我更好的解决方案,但如果 name 属性在标签的后面存在,它确实会将 name 属性移到开头。
  • 有问题吗? AFAIK,属性的顺序无关紧要。
【解决方案2】:

这不是一个完美的解决方案,标签内的间距和位置可能不是您想要的,但它确实实现了目标。这是一个 perl 正则表达式,但没有什么特别的 perl 特定的。

s/(&lt;IMG)((\s+[^&gt;]*)name="[^"]*")?(.*)/$1$3 name="myID"$4/g

【讨论】:

  • 这几乎可以工作。当“名称”标签不是第一个标签时,它会失败。
  • 那是不真实的。你测试了吗? (\s+[^>]) 覆盖前面的属性。
【解决方案3】:

如果像在您的示例中一样,name 属性始终是 IMG 标记内的第一个属性,那么这很容易。搜索

&lt;(?!/)(/w+)\s+(name="[^"]+")?

并替换为

&lt;\1 name="myImg1"

但我怀疑这是你真正想要的。

如果name属性可以出现在其他位置,那就更难了。

【讨论】:

  • 好吧,因为我编辑一般的 HTML 文件,我不能确定属性是第一个。实际上,我很确定不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2017-07-15
  • 1970-01-01
  • 2011-10-01
  • 2015-05-10
相关资源
最近更新 更多