solo per divertimento ecco un'espressione regolare che funzionerà con una sola preg_match_all
:
'%(?:Filed under:\s*+|\G</a>)[^<>]*+<a[^<>]*+>\K[^<>]*%`
Oppure, in un formato più leggibile:
'%(?:
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
corrisponde alla posizione in cui inizia il successivo tentativo di corrispondenza, che di solito è il punto in cui è terminata la precedente partita andata a buon fine (ma se la precedente corrispondenza era a lunghezza zero, salta in avanti un'altra). Ciò significa che l'espressione regolare non corrisponderà una sottostringa partendo </a>
fino dopo è abbinato uno a partire con Filed under:
in almeno una volta.
Dopo che la stringa sentinella o un tag di chiusura sono stati abbinati, [^<>]*+<a[^<>]*+>
consuma tutto fino al tag di inizio successivo incluso. Quindi \K
esegue lo spoofing della posizione iniziale in modo che la corrispondenza (se presente) venga avviata dopo il tag <a>
(è come un lookbehind positivo, ma più flessibile). Infine, [^<>]+
corrisponde al contenuto del tag e porta la posizione della corrispondenza fino al tag di fine, in modo che \G
possa corrispondere.
Ma, come ho detto, questo è solo per divertimento. Se non lo fai avere per fare il lavoro in una regex, stai meglio con un approccio multi-passo come quello usato da @codaddict; è più leggibile, più flessibile e più gestibile.
\K
reference
\G
reference
EDIT: Anche se i riferimenti che ho dato sono per la documentazione Perl, queste caratteristiche sono supportata da PHP, anche - o, più precisamente, dal lib PCRE. Penso che i documenti Perl siano un po 'migliori, ma puoi anche leggere su questo materiale nello PCRE manual.
fonte
2010-02-05 09:15:59
Grazie, ma ho davvero bisogno di usare il flag "Filed under:". Mentre il mio testo di esempio era rudimentale, il file che sto analizzando è piuttosto complicato e Archiviato in: è davvero l'unico identificatore univoco con cui devo lavorare. Fortunatamente, è alla fine del file, quindi posso abbinare fino in fondo. –
Abbastanza vicino. :) Grazie. –