[Php-it] [OT regex] Un'altro caso di regex inadempiente...
Domenico L.
domenico.lorusso at pleiade.it
Wed Nov 29 09:48:07 CET 2006
Matteo Beccati ha scritto:
>
> Domenico L. ha scritto:
>> preg_match_all('/([^|]+)\|?/m',$testo,$ar); print_r($ar); =>
>> otteniamo il risultato voluto
>>
>> preg_match_all('/([^|]+)\|?$/m',$testo,$ar); print_r($ar); => ci
>> tronca tutta la prima riga fino al carattere \n
>
> Ergo, se metti la $ e il modificatore m vuol dire che vuoi proprio
> arrivare a fine riga, che ci sia o non ci sia un "|" come terminatore.
Ergo nulla o spieghi e dai una mano o non appesantire inutilmente il
trhead. Se metto $ è perché è mia intenzione definire il fine riga non
il fine testo (altrimenti non usavo m).
E visto che piace a tutti fare citazioni:
/m/ (PCRE_MULTILINE)
"Invece quando viene indicato questo modificatore, "inizio riga" e "fine
riga" vengono identificati in base ai caratteri di "a capo" presenti nel
testo (rispettivamente subito dopo e subito prima di questo carattere).
Questo comportamento è equivalente al modificatore /m di Perl. Se nel
testo passato non vi sono caratteri di "a capo" o non vi sono occorrenze
dei caratteri ^ o $ nell'espressione regolare, l'uso di questo
modificatore non ha effetto"
/D/ (PCRE_DOLLAR_ENDONLY)
"L'uso di questo modificatore forza il carattere $ dell'espressione
regolare a indicare la fine della stringa oggetto della ricerca. Senza
questo modificatore il carattere $ indica la posizione subito prima
dell'ultimo carattere se questo è un "a capo" (ma comunque non prima di
ogni altro "a capo"). Questo modificatore viene ignorato se è attivato
il modificatore /m/. Non vi sono flag equivalenti in Perl."
Da queste due definizioni io capisco che i due modificatori cambiano il
modo di interpretare i caratteri ^ $ facendo in modo che se uso m ^ sia
inizio riga e $ fine riga
Ed è esattamente quello che mi aspetto.
Perché /([^|]+)\|?$/m
non trova 'ciao|
mioa'
Ma mi riconosce 'ciao
mioa'
Il problema, a me sembra, che non riesce a leggere compiutamente
l'opzionalità dell'ultimo carattere della riga
però riscrivendo /([^|]+)(\|$|$)/m
il risultato non cambia cosa c'è che mi sfugge
Saluti
--
Domenico L. icq: 645 44 861
per stupire mezz'ora basta un libro di storia,
io cercai di imparare la Treccani a memoria... [F.d.A.]
More information about the Php-it
mailing list