Проблема с регулярным выражением - получить содержимое тега с заданным классом - preg_match(_all)
-
16-09-2019 - |
Вопрос
Мне нужно получить содержимое <p>
тег с заданным классом.Класс мог бы быть simplecomment
или comment
...
Итак, я написал следующий код
preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc);
К сожалению, он ничего не возвращает.Однако, если я удалю часть, заканчивающуюся тегом (<\/p>
) это как-то работает, возвращая строку, которая слишком длинная (от начала тега до конца документа)...
Что не так с моим регулярным выражением?
Решение
Попробуйте использовать dom-анализатор, например http://simplehtmldom.sourceforge.net/
Если я правильно прочитал пример кода на домашней странице simplehtmldom вы могли бы сделать что-то вроде этого:
$html->find('div.simplecomment', 0)->innertext = '';
Другие советы
Быстрое решение здесь следующее:
'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is'
Изменения:
- Конструкция
(.*)
будет просто слепо сопоставлять все, что мешает работе вашего регулярного выражения, поэтому я полностью заменил эти экземпляры более строгими совпадениями:- ...
comment(.*)?
...– по сути, это будет соответствовать всему или ничего.Я заменил это на[^"]*
поскольку это будет соответствовать нулю или более не-"
символы (в основном, они будут соответствовать закрывающему"
характерclass
атрибут. - ...
>)(.*)<\/p>
...– опять же, это будет слишком много.Я заменил его эффективным шаблоном, который будет соответствовать всем не-<
персонажей, и как только он попадает в<
он проверит, следует ли за ним</p>
.Если да, то совпадение перестанет соответствовать (поскольку мы находимся в конце<p>
тег), в противном случае он продолжится.
- ...
- я удалил
m
флаг, поскольку он бесполезен в этом регулярном выражении.
Но это не будет надежно (представьте себе <p class="comment">...<p>...</p></p>
;это будет соответствовать <p class="comment">...<p>...</p>
).
Чтобы сделать его надежным, вам нужно будет использовать рекурсивные регулярные выражения или (что еще лучше) анализатор HTML (или XML, если вы имеете дело с XHTML). Существуют даже библиотеки, которые могут «правильно» обрабатывать некорректный HTML ( как это делают браузеры.)