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

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

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

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

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

Какое регулярное выражение вы используете Perl, Java, awk и т. д.?

sblundy 11.12.2008 17:56

Perl. Но Python / awk / egrep будет не хуже.

Moshe 11.12.2008 18:14
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
2
3 044
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

и заменить на

<\1 name = "myImg1"

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

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

Ну, поскольку я редактирую общие файлы HTML, я не могу быть уверен, что атрибут является первым. На самом деле, я совершенно уверен, что это не так.

Moshe 11.12.2008 18:43

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

s/(&lt;IMG)((\s+[^&gt;]*)name = "[^"]*")?(.*)/$1$3 name = "myID"$4/g

Это почти работает. Это не удается, когда тег «name» не является первым.

Moshe 11.12.2008 18:50

Это неправда. Вы это тестировали? (\ s + [^>]) охватывает предыдущие атрибуты.

Sean 17.12.2008 18:54
Ответ принят как подходящий

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

s/<IMG
  ((?:\s+(?!name\b)\w+ = "[^"]+")*)
  (?:\s+name = "[^"]+")?
  ((?:\s+(?!name\b)\w+ = "[^"]+")*)
  >
 /<IMG name = "myName"$1$2>
 /xg;

Это лучшее решение, чем мое, но оно перемещает атрибут имени в начало, если он существует позже в теге.

Sean 17.12.2008 19:00

Это проблема? AFAIK, порядок атрибутов не имеет значения.

Alan Moore 26.12.2008 18:12

Другие вопросы по теме