2008-12-11 93 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