我正在尋找一個單行的正則表達式,其執行以下操作:正則表達式的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