Отмена неверного HTML-кода с помощью регулярных выражений

Мне нужно регулярное выражение pcre, которое выберет все html img теги без src части. Длинная история. С помощью я добрался до (?-s)<img(?!.*?src).*?\/> который работал нормально, пока строка не получила второй тег img WITH src part. Регулярное выражение соответствует первому <img с последним />:(

Как я могу выбрать плохую часть <img border="0" /> от:

<p align="center"><img border="0" /> <a href="http://www.megaevent2014.com/enllac/"><img alt src="http://www.megaevent2014.com/banner/gran/" /></a></p>

В одном регулярном выражении.

И теги img могут быть недействительными по многим причинам. Выделение "границы" не помогает. Мне нужно выбрать теги без src, не заботясь ни о чем другом.

Пожалуйста, совет, С уважением, Питер

1 ответ

Следующий шаблон регулярных выражений работает для меня и должен быть правильно сформирован для регулярных выражений PCRE:

<img(\s*(?!src)([\w\-])+=([\"\'])[^\"\']+\3)*\s*\/?>
  • Чтобы разбить его, вы начинаете с буквального <imgа затем \s* соответствует любому пробелу [\r\n\t\f ] ноль или неограниченное количество раз.
  • (?!src) является негативным взглядом, который гарантирует, что строка src НЕ соответствует.
  • Вторая группа захвата ([\w\-])+ ищет любой из [a-zA-Z0-9_] между одним и неограниченным временем, и является жадным (найдите его столько раз, сколько возможно), и \- буквально ищет дефис в случае, если он существует где-то внутри <img> пара тегов.
  • = это буквальный поиск знака равенства.
  • Третья группа захвата, ([\"\'])[^\"\']+\3 стремится найти одинарную или двойную кавычку, затем что-нибудь, НО одинарную или двойную кавычку (один или несколько раз), а затем \3 соответствует тому, что было найдено в качестве третьей группы захвата (одинарная или двойная кавычка)
  • Наконец то \s* соответствует любому пробелу [\r\n\t\f ] ноль или неограниченное количество раз, \/? соответствует прямому слешу ровно один раз, а > это заключительная скобка всего дела.

Регекс это весело.:-)

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