Регулярное выражение для соответствия определенному элементу HTML - PullRequest
1 голос
/ 06 октября 2010

Я пытаюсь написать регулярное выражение для соответствия следующему HTML.

<span class="hidden_text">Some text here.</span>

Я изо всех сил пытаюсь выписать условие, чтобы соответствовать ему, и попробовал следующее, но в некоторых случаяхтакже выбирает все после интервала.

$condition = "/<span class=\"hidden_text\">(.*)<\/span>/";

Если бы кто-нибудь мог выделить то, что я делаю неправильно, это было бы здорово.

Ответы [ 5 ]

8 голосов
/ 06 октября 2010

Вам нужно использовать не жадный выбор, добавив ? после .*:

$condition = "/<span class=\"hidden_text\">(.*?)<\/span>/";

Примечание: Если вам нужно сопоставить общий HTML, вы должны использоватьсинтаксический анализатор XML, такой как DOM .

4 голосов
/ 06 октября 2010

Вы не должны пытаться использовать регулярные выражения на нерегулярном языке, таком как HTML. Лучше использовать правильный анализатор HTML для анализа документа.

См. Следующие вопросы для получения дополнительной информации о том, как сделать это с помощью PHP:

2 голосов
/ 06 октября 2010
$condition = "/<span class=\"hidden_text\">(?<=^|>)[^><]+?(?=<|$)<\/span>/";

Я понял. ;)

0 голосов
/ 07 октября 2010

Я думаю, это то, что они называют обучаемым моментом .: P Давайте теперь сравним и сопоставим регулярное выражение в вашем самоответе:

"/<span class=\"hidden_text\">(?<=^|>)[^><]+?(?=<|$)<\/span>/"

... и этот:

'~<span class="hidden_text">[^><]++</span>~'
  • двойное PHPстроки в кавычках подвергаются интерполяции встроенных переменных ($my_var) и оценке исходного кода, заключенного в фигурные скобки ({return "foo"}).Если вы не используете эти функции, лучше использовать строки в одинарных кавычках, чтобы избежать неожиданностей.В качестве бонуса вам больше не нужно избегать этих двойных кавычек.

  • PHP позволяет вам использовать практически любой знак препинания ASCII для разделителей регулярных выражений.Заменив косые черты на ~, я избавился от необходимости избегать косой черты в закрывающем теге.

  • Взгляд назад - (?<=^|>) - не делал ничего полезного.Он будет оцениваться только сразу после сопоставления с открывающим тегом, поэтому предыдущий символ был всегда >.

  • [^><]+? - это хорошо (при условииВы не хотите разрешать другие теги в контенте), но квантификатор не должен быть неохотным.[^><]+ не может переполнить закрывающий тег </span>, поэтому есть смысл подкрадываться к нему.Фактически, идите вперед и пинайте дверь с помощью собственнического квантификатора : [^><]++.

  • Как и предыдущий взгляд, (?=<|$) только занималпространство.Если [^><]+ потребляет все, что может, а следующий символ не <, вам не нужно заглядывать, чтобы сказать, что матч провалится.

Обратите внимание, что я 'я просто критикую свое регулярное выражение, а не исправляю его;Ваше регулярное выражение и мое, вероятно, будут давать одинаковые результаты каждый раз.Есть много способов, как они могут пойти не так, даже если HTML-код, с которым вы работаете, совершенно корректен.Сопоставление HTML с регулярными выражениями похоже на попытку поймать смазанную свинью.

0 голосов
/ 06 октября 2010

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

Намного проще использовать PHP DOM Parser для извлечения контента из HTML

...