Закрыть все скрытые IMG-теги HTML
Можно ли заменить регулярное выражение на все теги IMG, которые закрыты? Если да, то как бы я определил:
<img src="..." alt="...">
... в качестве потенциального canidate для замены?
= <img src="..." alt="..."/>
Обновление. У нас есть сотни страниц и тысячи тегов изображений, все из которых должны быть закрыты. Я не зацикливаюсь на RegEx - любой другой метод, помимо ручного обновления всех тегов IMG, будет достаточным.
Ответы
Ответ 1
(<img[^>]+)(?<!/)>
будет соответствовать тегу img
, который неправильно закрыт. Это требует, чтобы используемое вами выражение regex поддерживает lookbehind (в котором Ruby и JavaScript не работают, но большинство других). Backreference no. 1 будет содержать совпадение, поэтому, если вы ищете это регулярное выражение и замените на \1/>
, вам должно быть хорошо идти.
Если вам нужно учитывать возможность >
внутренних атрибутов, вы можете использовать
(<img("[^"]*"|[^>])+)(?<!/)>
Это будет соответствовать, например,
<img src="image.gif" alt="hey, look--->">
<img src="image/image.gif">
и оставьте
<img src="image/image.gif" />
один.
Ответ 2
В HTML конечный тег для <img>
"должен быть опущен", поэтому начальный тег закрывает элемент, и вы не можете иметь незакрытый img.
Если вы хотите преобразовать свой HTML в XHTML, используйте реальный синтаксический анализатор. Регулярные выражения - не очень хороший инструмент для этой работы.
Ответ 3
Что именно вы подразумеваете под "незакрытыми"?
<img src="a1.jpg <--no ending quotes and end parens
<img src="a1.jpg" <-- no end parens
<img src="a1.jpg"> <-- the tag does not self-close as should be done in XHTML
Вы можете попытаться разумно найти таких подозреваемых, но вы никогда не гарантируете себя безупречным.
Ответ 4
Я никогда не пробовал это, но закрытый тег img - это тег, начинающийся с <img
с файлами и />
в конце.
Вот что я пробовал в perl
!/usr/bin/env perl
my @images = ('<img src="toto.jpg">',
'<img src="truc/machin.jpg" title="pouet" >',
'<img src="pouet.jpg" alt="toto" />',
'<img src="math/a-greater-than-b.png" alt="a > b">');
foreach (@images) {
if (/<img\s+(([a-z]+=".*?")+\s*)>/) {
print "Match : <img $1 />\n";
}
}
Выдает:
Match : <img src="toto.jpg" />
Match : <img src="truc/machin.jpg" title="pouet" />
Match : <img src="math/a-greater-than-b.png" alt="a > b" />