2008-12-11 4 views
2

Я ищу одной строки регулярное выражение, которое делает следующее:Regex для 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

Если, как и в вашем примере, атрибут имени всегда является первым в теге IMG, тогда это очень просто. Поиск

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

и заменить

<\1 name="myImg1"

, но я сомневаюсь, что это то, что вы действительно хотите.

Если атрибут name может встречаться в других положениях, это становится сложнее.

+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

Это почти работает. Он не работает, когда тег «name» не является первым. – Moshe 2008-12-11 15:50:39

Смежные вопросы