2013-06-12 2 views
0

У меня есть строка, в которой я хочу получить содержимое только те теги DIV, которые не имеют класса image.Регулярное выражение, чтобы отменить те div, у которых есть класс = "image"

Я использую это регулярное выражение:

#<\s*?div\b[^>]*class="[^image]">(.*?)</div\b[^>]*>#s 

но оно ускользает все DIV-теги, а не только те, с классом image

+1

** Не использовать регулярные выражения для разбора HTML **. Вы не можете достоверно разобрать HTML с регулярными выражениями, и вы столкнетесь с печалью и разочарованием в будущем. Как только HTML изменится с ваших ожиданий, ваш код будет сломан. См. Http://htmlparsing.com/php для примеров того, как правильно анализировать HTML с PHP-модулями, которые уже были написаны, протестированы и отлажены. –

ответ

0

Выражение [^image] будет находить только те классы, которые делают не содержат i И m и т.п. буквы. Может быть, negative lookahead может сделать трюк:

#<\s*?div\b[^>]class=\"(?:(?!image).)*\">(.?)*>#s 

Это будет увольнять class="images" и т.д., но я надеюсь, что это хорошее начало. :)

PS: Я не знаю, что последнее ] необходимо или нет, но оно отсутствует в моем регулярном выражении.

1

Вы, скорее всего, лучше с DOM parser.

В любом случае, вот регулярное выражение, которое должно делать то, что вы после:

<div[^>]+class="(?!(?:.+)?image(?: .+)?")([^"]+)" 

Демо: http://rubular.com/r/eekxdFdmFR

Смежные вопросы