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

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

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

Я работаю в офисе с Visual Web Developer 2008. Диалог Edit → Find может использовать регулярные выражения.

Ответ 1

Это действительно сложно, потому что регулярные выражения в основном касаются соответствия тому, что есть. С обворожительной обманкой вы можете делать такие вещи, как "найти 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*\/?>/

Текущие ограничения:

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

Ответ 2

Основываясь на ответах г-на Блэка и Роберта126:

/(<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, вы можете использовать его в сочетании со строкой replace:

$1 alt=""$3

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

Ответ 3

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

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

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

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

Итак, это будет соответствовать:

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

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

<img src="foo.jpg" class="baltic" alt="" />
<img src="foo.jpg" alt="I have a value.">

Ответ 4

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

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

Я обновляюсь и для раздела 508!

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

Я написал простой код для этого без Regex

let arr = []
$('img')
.filter(function() {
  arr.push(this.alt)
})
document.write(arr.filter(a=>!a).length + ' img without alt tag')