2014-01-15 4 views
0

Я не могу заставить это работать, и я надеялся на какую-то помощь.PHP Regex: игнорировать закрывающий тег HTML, если

Я пытаюсь захватить содержимое конкретного div(пожалуйста, сохранить DOM говорить, для этой цели он на самом деле не вступают в игру.)

Проблема заключается в том, I похоже, не может заставить его работать, если есть еще один div с атрибутами перед ним в той же строке. Я попытался указать только совпадение, если нет > между <div и class="myClass", но я думаю, что я делаю это неправильно.

Я все еще довольно озадачен регулярным выражением.

/<div(?!>).*?class="myClass".*?>(.*?)<\/div>/mi 

(полу) Рабочий пример:http://regex101.com/r/cW0lW6

+1

Почему вы используете регулярное выражение для HTML? – zakangelle

+0

Технически я использую его в строке PHP, прошедшей через почту через ajax для новой версии моей CMS. Уверяю вас, это по доброй причине. –

ответ

0

Попробуйте

/<div(?=\s)(?:(?!>).)+?class="myClass".*?>(.*?)<\/div>/si

+0

Cool. Поразмыслить над '(?: (?!>).) +?'? Почему '.' anychar и' +? ' –

+0

Его фантастический способ написать уровень класса' [^>] + ', но то, что класс не будет делать, это' (? :(?! какая-то мусорная строка).) + '. Niether '?' Необходимо, а также '[^>]' полностью правильно, но это для другого дня, для которого требуется регулярное выражение на 15 страниц. Все '. *?' S тоже неверны, подумал, что я только начну с некоторых основ. – sln

+0

Все виды whooey в этих регулярных выражениях. Многие вопросы, такие как закрытие тега среди '[^>] *', бесконечны, но выполнимы. Большинство просто хотят быстрого и грязного решения, они не понимают скрытую добычу. – sln

0

Вы не можете разобрать [X] HTML с регулярным выражением. Поскольку HTML не может быть проанализирован regex. Regex не является инструментом, который можно использовать для правильного анализа HTML.

См: RegEx match open tags except XHTML self-contained tags

Я предлагаю использовать QueryPath для разбора XML и HTML в PHP. В основном это тот же синтаксис, что и jQuery, только на стороне сервера.

+0

Для моей цели это конкретное решение, вероятно, является * единственным способом. Использование DOM в этом случае было бы, imo, очень хаки. В 99,9% случаев я согласен, что это может вызвать проблемы. Это использование будет 0,1%, таким образом, моя просьба избавить меня от темы. –

+0

@kcdwayne Я не согласен: вы никогда не должны использовать регулярное выражение для анализа HTML **. Просто используйте [DOMDocument] (http://de2.php.net/domdocument).Это очень легко, когда вы это понимаете - * учитесь, делая *. – mate64

+0

Я * делаю * понимаю DOM, и могу отлично его протекать. Дело в том, что все, что я делаю, - это отбрасывание контейнера-пугала, который я использовал для защиты важной строки PHP. Я делаю это таким образом, чтобы снизить риски безопасности в новой версии моей CMS, таким образом я могу устранить любой вредоносный PHP, который может быть вставлен при защите моего. Вы видели только фрагмент, излагающий проблему. Мне не нужна лекция, мне нужно решение проблемы * regex *. И первый ответ связанного вопроса умен, я видел его несколько раз. –

-2

Вы можете использовать это (простой способ):

~<div[^>]+?class="myClass"[^>]*>(.*?)</div>~si 

или это (более эффективный способ, если у вас есть много атрибутов):

~<div(?>[^>c]++|\Bc|c(?!lass=))+class="myClass"[^>]*+>(.*?)</div>~si 

Обратите внимание, что эти модели не работают если ваш тег div содержит еще один тег div.

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