Я ищу однострочное регулярное выражение, которое делает следующее:
Учитывая HTML-тег с атрибутом «name», я хочу заменить его своим собственным атрибутом. Если в этом теге отсутствует атрибут name, я хочу внедрить свой собственный атрибут. Результат должен выглядеть так:
<IMG name = "img1" ...> => <IMG name = "myImg1" ...>
<IMG ...> => <IMG name = "myImg1" ...>
Можно ли это сделать с помощью однострочного регулярного выражения?
Perl. Но Python / awk / egrep будет не хуже.






Если, как в вашем примере, атрибут имени всегда является первым внутри тега IMG, тогда это очень просто. Искать
<(?!/)(/w+)\s+(name = "[^"]+")?
и заменить на
<\1 name = "myImg1"
но я сомневаюсь, что это то, чего вы действительно хотите.
Если атрибут name может встречаться в других позициях, становится сложнее.
Ну, поскольку я редактирую общие файлы HTML, я не могу быть уверен, что атрибут является первым. На самом деле, я совершенно уверен, что это не так.
Это не идеальное решение, интервал и позиция в теге могут быть не совсем такими, как вы хотите, но оно позволяет достичь поставленных целей. Это с регулярным выражением Perl, но в нем нет ничего специфичного для Perl.
s/(<IMG)((\s+[^>]*)name = "[^"]*")?(.*)/$1$3 name = "myID"$4/g
Это почти работает. Это не удается, когда тег «name» не является первым.
Это неправда. Вы это тестировали? (\ s + [^>]) охватывает предыдущие атрибуты.
Уловка состоит в том, чтобы сопоставить все полные пары «атрибут = значение», но захватывать - только те, чье имя атрибута не является «именем». Затем вставьте свой собственный атрибут «name» вместе со всеми захваченными.
s/<IMG
((?:\s+(?!name\b)\w+ = "[^"]+")*)
(?:\s+name = "[^"]+")?
((?:\s+(?!name\b)\w+ = "[^"]+")*)
>
/<IMG name = "myName"$1$2>
/xg;
Это лучшее решение, чем мое, но оно перемещает атрибут имени в начало, если он существует позже в теге.
Это проблема? AFAIK, порядок атрибутов не имеет значения.
Какое регулярное выражение вы используете Perl, Java, awk и т. д.?