[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