2008-12-11 91 views
2

我正在寻找一个单行的正则表达式,其执行以下操作:正则表达式的HTML属性替换/另外

给定一个HTML标记的“name”属性,我想用我自己的属性来代替它。如果该标签缺少名称属性,我想植入我自己的属性。结果应该是这样的:

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

这可以用一个单行的正则表达式来完成吗?

+0

你使用Perl,Java,awk等的哪个正则表达式? – sblundy 2008-12-11 14:56:22

+0

Perl。但是Python/awk/egrep会一样好。 – Moshe 2008-12-11 15:14:42

回答

4

关键是要匹配每一个完整的“属性=值”对,但捕获,只有其属性名称不是“名”的人。然后插入您自己的“名称”属性以及所有捕获的属性。

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

如果像你的例子中那样,name属性总是IMG标签中的第一个,那么这很容易。搜索

<(?!/)(/w+)\s+(name="[^"]+")?

,代之以

<\1 name="myImg1"

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

如果名称属性可能出现在其他位置,则会变得更加困难。

+0

那么,因为我编辑了一般的HTML文件,所以我无法确定该属性是否是第一个。其实,我很确定它不是。 – Moshe 2008-12-11 15:43:49

1

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

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

这几乎可以工作。当“名称”标签不是第一个时,它会失败。 – Moshe 2008-12-11 15:50:39