Использование регулярных выражений для поиска тегов 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')