Мне нужно регулярное выражение 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 ответ1

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .