Regex для замены / добавления атрибута HTML

Я ищу регулярное выражение одной строки, которая делает следующее:

Учитывая HTML-тег с атрибутом «name», я хочу заменить его своим собственным атрибутом. Если у этого тега отсутствует атрибут name, я хочу внедрить свой собственный атрибут. Результат должен выглядеть так:

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

Можно ли это сделать с помощью регулярного выражения в одной строке?

11.12.2008 14:49:38
Какое регулярное выражение вы используете Perl, Java, awk и т. Д.?
sblundy 11.12.2008 14:56:22
Perl. Но Python / awk / egrep будет таким же хорошим.
Moshe 11.12.2008 15:14:42
3 ОТВЕТА
РЕШЕНИЕ

Хитрость заключается в том, чтобы соответствовать каждой полной паре «атрибут = значение», но захватывать только те, чье имя атрибута не «имя». Затем подключите свой собственный атрибут «name» вместе со всеми захваченными.

s/<IMG
  ((?:\s+(?!name\b)\w+="[^"]+")*)
  (?:\s+name="[^"]+")?
  ((?:\s+(?!name\b)\w+="[^"]+")*)
  >
 /<IMG name="myName"$1$2>
 /xg;
4
11.12.2008 23:03:42
Это лучшее решение, чем мое, но оно перемещает атрибут name в начало, если он существует позже в теге.
Sean 17.12.2008 16:00:06
Это проблема? AFAIK, порядок атрибутов не имеет значения.
Alan Moore 26.12.2008 15:12:07

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

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

и заменить на

<\1 name="myImg1"

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

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

0
11.12.2008 15:32:22
Ну, так как я редактирую общие HTML-файлы, я не могу быть уверен, что атрибут является первым. На самом деле, я совершенно уверен, что это не так.
Moshe 11.12.2008 15:43:49

Это не идеальное решение, интервал и позиция внутри тега могут быть не совсем такими, как вы хотите, но они достигают поставленных целей. Это с регулярным выражением perl, но в нем нет ничего специфичного для perl.

s/(&lt;IMG)((\s+[^&gt;]*)name="[^"]*")?(.*)/$1$3 name="myID"$4/g
1
5.03.2010 14:50:57
Это почти работает. Сбой, когда тег name не первый.
Moshe 11.12.2008 15:50:39
Это неправда. Вы проверяли это? (\ s + [^>]) охватывает предшествующие атрибуты.
Sean 17.12.2008 15:54:12