Использование регулярных выражений для поиска тегов img без атрибута alt - PullRequest
16 голосов
/ 27 октября 2010

Я прохожу большой сайт (более 1600 страниц), чтобы он прошел Приоритет 1 W3C WAI.В результате такие вещи, как теги изображений, должны иметь атрибуты alt.

Каким было бы регулярное выражение для поиска тегов img без атрибутов alt?Если возможно, с небольшим объяснением, чтобы я мог использовать его для поиска других проблем.

Я нахожусь в офисе с Visual Web Developer 2008. В диалоговом окне Редактировать >> Найти можно использовать регулярные выражения.

Ответы [ 7 ]

31 голосов
/ 22 июля 2013

Опираясь на Mr.Black и Roberts126 ответы:

/(<img(?!.*?alt=(['"]).*?\2)[^>]*)(>)/

Это будет соответствовать тегу img в любом месте кода, в котором нет ни тега alt, ни тега alt, за которым не следует = "" или = '' (т.е. недействительные теги alt).

Разбивка:

(          : open capturing group
<img       : match the opening of an img tag
(?!        : open negative look-ahead
.*?        : lazy some or none to match any character
alt=(['"]) : match an 'alt' attribute followed by ' or " (and remember which for later)
.*?        : lazy some or none to match the value of the 'alt' attribute
\2)        : back-reference to the ' or " matched earlier
[^>]*      : match anything following the alt tag up to the closing '>' of the img tag
)          : close capturing group
(>)        : match the closing '>' of the img tag

Если ваш редактор кода позволяет выполнять поиск и замену с помощью Regex, вы можете использовать это в сочетании со строкой замены:

$1 alt=""$3

Чтобы найти любые alt-less теги img и добавить к ним пустой тег alt. Это полезно при использовании проставок или других изображений макета для электронных писем в формате HTML и т. П.

16 голосов
/ 08 августа 2015

Вот то, что я только что попробовал в своей собственной среде с огромной базой корпоративного кода с некоторым хорошим успехом (не обнаружил ложных срабатываний, но определенно нашел действительные случаи):

<img(?![^>]*\balt=)[^>]*?>

Что происходит в этом поиске:

  1. найти открытие тега
  2. ищите отсутствие нуля или более символов, которые не являются закрывающей скобкой, а также ...
  3. Проверка на отсутствие слова, начинающегося с «alt» («\ b» служит для того, чтобы убедиться, что мы не получаем совпадение имени в середине слова для чего-то вроде значения класса), а за ним следует «» = ", тогда ...
  4. ищет ноль или более символов, которые не являются закрывающей скобкой
  5. найти закрывающую скобку

Так что это будет соответствовать:

<img src="foo.jpg" class="baltic" />

Но он не будет совпадать ни с одним из них:

<img src="foo.jpg" class="baltic" alt="" />
<img src="foo.jpg" alt="I have a value.">
8 голосов
/ 07 марта 2013

Это работает в Eclipse:

<img(?!.*alt).*?>

Я также обновляю для Раздела 508!

7 голосов
/ 07 августа 2012

Это сработало для меня.

^<img(?!.*alt).*$

Это соответствует любой строке, начинающейся с <img, которая не содержит никакого количества символов перед атрибутом alt. Это даже работает для src="<?php echo $imagename; ?>" типа атрибутов.

1 голос
/ 09 октября 2018

Это вполне возможно при использовании следующего regEx:

<img([^a]|a[^l]|al[^t]|alt[^=])*?/>

Искать что-то, чего нет, довольно сложно, но мы можем обмануть их, ища группу, которая не запускаетсяс «а» или «а», за которым не следует «л» и т. д.

1 голос
/ 24 ноября 2017

Просто и эффективно:

<img((?!\salt=).)*?

Это регулярное выражение работает для поиска тегов <img>, в которых отсутствует атрибут alt.

0 голосов
/ 27 октября 2010

Это действительно сложно, потому что регулярные выражения в основном соответствуют тому, что есть.С помощью хитрости осмотра вы можете делать такие вещи, как «найти A, которому не предшествует / не следует B» и т. Д. Но я думаю, что самым прагматичным решением для вас не было бы это.немного в вашем существующем коде, не делающем слишком сумасшедших вещей, и вам, возможно, придется его настроить, но я думаю, что это хороший вариант, если вы действительно хотите использовать поиск RegEx для вашей проблемы.

Поэтому я предлагаю найти все теги img, которые могут (но не обязательно) иметь все допустимые атрибуты для img-элемента.С этим подходом вы можете работать - решать вам.

Предложение:

/<img\s*((src|align|border|height|hspace|ismap|longdesc|usemap|vspace|width|class|dir|lang|style|title|id)="[^"]"\s*)*\s*\/?>/

В настоящее время действуют следующие ограничения:

  1. Ожидается ваш атрибутзначения, которые должны быть разделены двойными кавычками,
  2. Не учитывает возможный встроенный атрибут * Event,
  3. Не находит элементы img с недопустимыми атрибутами.
...