Sólo por diversión aquí es una expresión regular que trabajará con un único preg_match_all
:
'%(?:Filed under:\s*+|\G</a>)[^<>]*+<a[^<>]*+>\K[^<>]*%`
O, en un formato más legible:
'%(?:
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
coincide con la posición donde comenzaría el siguiente intento de coincidencia, que suele ser el lugar donde finalizó la partida anterior exitosa (pero si la partida anterior fue de longitud cero, se adelanta una más). Eso significa que la expresión regular no coincidirá con una subcadena que comience por </a>
hasta después de, que coincide con una que comienza con Filed under:
al menos una vez.
Después de que la cadena de centinela o una etiqueta final se haya emparejado, [^<>]*+<a[^<>]*+>
consume todo, incluso la siguiente etiqueta de inicio. A continuación, \K
falsifica la posición de inicio, por lo que parece que se inicia la coincidencia (si hay una) después de la etiqueta <a>
(es como un aspecto positivo pero más flexible). Finalmente, [^<>]+
coincide con el contenido de la etiqueta y lleva la posición del partido hasta la etiqueta final para que \G
pueda coincidir.
Pero, como dije, esto es solo por diversión. Si no tiene tiene para hacer el trabajo en una expresión regular, es mejor con un enfoque de varios pasos como el que usa @codaddict; es más legible, más flexible y más fácil de mantener.
\K
reference
\G
reference
EDIT: Aunque las referencias que he dado son para la documentación de Perl, estas características son apoyado por PHP, también - o, más exactamente, por la lib PCRE. Creo que los documentos de Perl son un poco mejores, pero también puedes leer sobre esto en el PCRE manual.
Gracias, pero realmente necesito usar el indicador "Archivado en:". Si bien mi texto de ejemplo era rudimentario, el archivo real que estoy analizando es bastante complicado, y archivado en: es realmente el único identificador único con el que tengo que trabajar. Afortunadamente, está al final del archivo, por lo que puedo hacer coincidir todo el camino hasta el final. –
Lo suficientemente cerca. :) Gracias. –