我正在寻找一个单行的正则表达式,其执行以下操作:正则表达式的HTML属性替换/另外
给定一个HTML标记的“name”属性,我想用我自己的属性来代替它。如果该标签缺少名称属性,我想植入我自己的属性。结果应该是这样的:
<IMG name="img1" ...> => <IMG name="myImg1" ...>
<IMG ...> => <IMG name="myImg1" ...>
这可以用一个单行的正则表达式来完成吗?
我正在寻找一个单行的正则表达式,其执行以下操作:正则表达式的HTML属性替换/另外
给定一个HTML标记的“name”属性,我想用我自己的属性来代替它。如果该标签缺少名称属性,我想植入我自己的属性。结果应该是这样的:
<IMG name="img1" ...> => <IMG name="myImg1" ...>
<IMG ...> => <IMG name="myImg1" ...>
这可以用一个单行的正则表达式来完成吗?
关键是要匹配每一个完整的“属性=值”对,但捕获,只有其属性名称不是“名”的人。然后插入您自己的“名称”属性以及所有捕获的属性。
s/<IMG
((?:\s+(?!name\b)\w+="[^"]+")*)
(?:\s+name="[^"]+")?
((?:\s+(?!name\b)\w+="[^"]+")*)
>
/<IMG name="myName"$1$2>
/xg;
如果像你的例子中那样,name属性总是IMG标签中的第一个,那么这很容易。搜索
<(?!/)(/w+)\s+(name="[^"]+")?
,代之以
<\1 name="myImg1"
但我怀疑,这是你真正想要的。
如果名称属性可能出现在其他位置,则会变得更加困难。
那么,因为我编辑了一般的HTML文件,所以我无法确定该属性是否是第一个。其实,我很确定它不是。 – Moshe 2008-12-11 15:43:49
这不是一个完美的解决方案,标签内的间距和位置可能并不完全符合您的要求,但它确实实现了目标。这是与perl正则表达式,但没有什么特定的perl特定的。
s/(<IMG)((\s+[^>]*)name="[^"]*")?(.*)/$1$3 name="myID"$4/g
这几乎可以工作。当“名称”标签不是第一个时,它会失败。 – Moshe 2008-12-11 15:50:39
你使用Perl,Java,awk等的哪个正则表达式? – sblundy 2008-12-11 14:56:22
Perl。但是Python/awk/egrep会一样好。 – Moshe 2008-12-11 15:14:42