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

515
Peter Hofman

Мне нужно регулярное выражение 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, не заботясь ни о чем другом.

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

0
Смотрите этот ответ на stackoverflow! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 Lord Peter 9 лет назад 0
@LordPeter Правда, это не может быть выполнено отказоустойчивым способом. Но в определенных ограниченных контекстах это может работать. LatinSuD 9 лет назад 0

1 ответ на вопрос

0
dashard

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

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