Я думаю, это то, что они называют обучаемым моментом .: P Давайте теперь сравним и сопоставим регулярное выражение в вашем самоответе:
"/<span class=\"hidden_text\">(?<=^|>)[^><]+?(?=<|$)<\/span>/"
... и этот:
'~<span class="hidden_text">[^><]++</span>~'
двойное PHPстроки в кавычках подвергаются интерполяции встроенных переменных ($my_var
) и оценке исходного кода, заключенного в фигурные скобки ({return "foo"}
).Если вы не используете эти функции, лучше использовать строки в одинарных кавычках, чтобы избежать неожиданностей.В качестве бонуса вам больше не нужно избегать этих двойных кавычек.
PHP позволяет вам использовать практически любой знак препинания ASCII для разделителей регулярных выражений.Заменив косые черты на ~
, я избавился от необходимости избегать косой черты в закрывающем теге.
Взгляд назад - (?<=^|>)
- не делал ничего полезного.Он будет оцениваться только сразу после сопоставления с открывающим тегом, поэтому предыдущий символ был всегда >
.
[^><]+?
- это хорошо (при условииВы не хотите разрешать другие теги в контенте), но квантификатор не должен быть неохотным.[^><]+
не может переполнить закрывающий тег </span>
, поэтому есть смысл подкрадываться к нему.Фактически, идите вперед и пинайте дверь с помощью собственнического квантификатора : [^><]++
.
Как и предыдущий взгляд, (?=<|$)
только занималпространство.Если [^><]+
потребляет все, что может, а следующий символ не <
, вам не нужно заглядывать, чтобы сказать, что матч провалится.
Обратите внимание, что я 'я просто критикую свое регулярное выражение, а не исправляю его;Ваше регулярное выражение и мое, вероятно, будут давать одинаковые результаты каждый раз.Есть много способов, как они могут пойти не так, даже если HTML-код, с которым вы работаете, совершенно корректен.Сопоставление HTML с регулярными выражениями похоже на попытку поймать смазанную свинью.