Просто для удовольствия вот регулярное выражение, которое будет работать с одним preg_match_all
:
'%(?:Filed under:\s*+|\G</a>)[^<>]*+<a[^<>]*+>\K[^<>]*%`
Или, в более удобном для чтения формате:
'%(?:
Filed under: # your sentinel string
|
\G # NEXT MATCH POSITION
</a> # an end tag
)
[^<>]*+ # some non-tag stuff
<a[^<>]*+> # an opening tag
\K # RESET MATCH START
[^<>]+ # the tag's contents
%x'
\G
соответствует позиции, в которой начнется следующая попытка совпадения, которая обычно совпадает с местом, где закончилось предыдущее успешное совпадение (но если предыдущий матч был нулевой длины, он снова продвигался вперед). Это означает, что регулярное выражение не будет соответствовать подстроке, начинающейся с </a>
, до после соответствует одному, начиная с Filed under:
хотя бы один раз.
После того, как целая строка или конечный тег были сопоставлены, [^<>]*+<a[^<>]*+>
потребляет все до следующего стартового тега. Затем \K
обманывает начальную позицию, так что совпадение (если оно есть) появляется после тега <a>
(это похоже на положительный lookbehind, но более гибкий). Наконец, [^<>]+
соответствует содержимому тега и выводит позицию соответствия до конца, поэтому \G
может соответствовать.
Но, как я уже сказал, это просто для удовольствия. Если у вас нет , выполните, чтобы выполнить задание в одном регулярном выражении, вам лучше с многоступенчатым подходом, например, с одним используемым @codaddict; это более читаемый, более гибкий и более удобный.
\K
reference
\G
reference
EDIT: Хотя ссылки я дал это для документации Perl, эти функции являются при поддержке PHP, тоже - или, точнее, по Lib PCRE. Я думаю, что документы Perl немного лучше, но вы также можете прочитать об этом в PCRE manual.
Спасибо, но мне действительно нужно использовать флаг «Подано под:». Хотя мой примерный текст был рудиментарным, фактический файл, который я обрабатываю, довольно сложный, и Filed under: действительно единственный уникальный идентификатор, с которым я должен работать. К счастью, он находится в конце файла, поэтому я могу полностью соответствовать цели. –
достаточно близко. :) Благодаря. –