Проблема с регулярным выражением - получить содержимое тега с заданным классом - preg_match(_all)

StackOverflow https://stackoverflow.com/questions/1277422

Вопрос

Мне нужно получить содержимое <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'

Изменения:

  • Конструкция (.*) будет просто слепо сопоставлять все, что мешает работе вашего регулярного выражения, поэтому я полностью заменил эти экземпляры более строгими совпадениями:
    1. ...comment(.*)?...– по сути, это будет соответствовать всему или ничего.Я заменил это на [^"]* поскольку это будет соответствовать нулю или более не-" символы (в основном, они будут соответствовать закрывающему " характер class атрибут.
    2. ...>)(.*)<\/p>...– опять же, это будет слишком много.Я заменил его эффективным шаблоном, который будет соответствовать всем не-< персонажей, и как только он попадает в < он проверит, следует ли за ним </p>.Если да, то совпадение перестанет соответствовать (поскольку мы находимся в конце <p> тег), в противном случае он продолжится.
  • я удалил m флаг, поскольку он бесполезен в этом регулярном выражении.

Но это не будет надежно (представьте себе <p class="comment">...<p>...</p></p>;это будет соответствовать <p class="comment">...<p>...</p>).

Чтобы сделать его надежным, вам нужно будет использовать рекурсивные регулярные выражения или (что еще лучше) анализатор HTML (или XML, если вы имеете дело с XHTML). Существуют даже библиотеки, которые могут «правильно» обрабатывать некорректный HTML ( как это делают браузеры.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top