Newsgroup: it.comp.www.php
Titolo: Espressioni regolari: se becco chi le ha inventate... :-/

Sto tentando di evitare che qualcuno mi inserisca in una stringa caratteri
non stampabili tipo ritorni di linea, e altre cose, insomma tutto quello che
va dall'ascii 0 all'ascii 31 e dall'ascii 127 all'ascii 255.
Vorrei usare la funzione preg_replace in questo modo:
$oggetto = preg_replace("(\0-\037)|(\0177-\0377)", "\040",
$_POST['oggetto']);
ma data la mia estrema imperiza nelle espressioni regolari e IMHO confusione
con cui vengono esposte nel PHP manual che ho scaricato (con frequenti
richiami alla sintassi del PERL - che non conosco) qualcosa va storto:
Warning: No ending matching delimiter ')' found in
E:\WWWTest\biblio\newdoc.php on line 44
In pratica vorrei sostituire detti caratteri non stampabili con un semplice
spazio.
Qualcuno che mi può dare qualche suggerimento?
Grazie e ciao!
Francesco

 richiami alla sintassi del PERL - che non conosco) qualcosa va storto:
E te la prendi con chi ha inventato le regular expressions? :) Capisco 
che siano poco comprensibili, ma sono MOLTO utili...
-- 
Saluti >^_^<
Hatanaka

 che siano poco comprensibili, ma sono MOLTO utili...
Utilità indubbia ma estremamente crittogene e spiegate malissimo su tutti
gli scritti che ho visto!
Mi è capitato in mano proprio adesso un manuale sul perl dove c'era un
intero capitolo dedicato alle espressioni regolari...
Dopo i dovuti salti di gioia mi sono dovuto ricredere: un trattato di pura
filosofia! Mi chiedo se questi testi li scrivono programmatori o gente che
non ha mai scritto una riga di codice!
Francesco

 $oggetto = preg_replace("[\0-\037]", "\040", $_POST['oggetto']);
Ah... P.S. Nessuna delle due funziona!
Warning: No ending matching delimiter ']' found in
E:\WWWTest\biblio\newdoc.php on line 44
Ciao!
Francesco

conosci già questo utilissimo programmillo?
http://www.weitz.de/regex-coach/


Hatanaka wrote:
Mi replico da solo perche' comunque sembrerebbe, ad una rapida occhiata 
sul manuale (c'e' scritto con tanto di esempi :P), che manchino gli 
slash: modifica l'espressione che ti ho detto in questo modo:
$oggetto = preg_replace("/[\0177-\0377]/", "\040", $_POST['oggetto']);
$oggetto = preg_replace("/[\0-\037]/", "\040", $_POST['oggetto']);
$oggetto = preg_replace("/[A-z0-9]/", "\040", $_POST['oggetto']);
-- 
Saluti >^_^<
Hatanaka

per dirlo ma non lo ricordo :P),
TMTOWTDI - There's More Than One Way To Do It
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 intero capitolo dedicato alle espressioni regolari...
Se e' quello della (Apogeo, se non ricrdo male?) tradotto da quello 
della O'Reilly, allora ti do' ragione: e' tradotto con i piedi 
(l'originale e' un po' - non tanto - meglio...)
Cmq prova qui:
http://www.lugg.org/lugg/index.php?it/computers/shell/regexp
Sempre che funzioni bene il link, ho saputo che ci sono dei problemi :P
Nel caso, ricorda sempre:
1. Google e' tuo amico.
2. Chi sa fa, chi non sa insegna. Da cio' viene:
    2.1 di manuali ce ne sono a bizzeffe, anche online;
    2.2 molti manuali non sono precisi, corretti, ecc. :)
    2.3 nel dubbio, occorre leggerli tutti. :P
-- 
Saluti >^_^<
Hatanaka

 
http://www.weitz.de/regex-coach/
Sto scaricando adesso...
F.

 Leonardo
Grazie Leonardo :)
Cmq per inciso, Francesco, prova con le slash, io non posso perche' non 
ho PHP sottomano...
-- 
Saluti >^_^<
Hatanaka

 ha scritto nel messaggio
news:AVFyb.8$Na6...@news.oracle.com...

Warning: No ending delimiter '/' found in E:\WWWTest\biblio\newdoc.php on
line 44
Vedo che non sono l'unico nella palta!!
Francesco

 all'ascii 255.
preg_replace('/[\x0-\x1f]|[\x7f-\xff]/', ' ', $stringa);
ti consiglio di usare i codici esa, se vuoi far cosi', perche' quelli
ottali possono anche voler fare altro e di certo sono quindi meno
performanti (
http://it.php.net/manual/it/pcre.pattern.syntax.php
).
Inoltre il problema che mi ha colpito era la storia dei no ending
matching blabla, / in effetti e' una convenzione, ma pare che da qualche
parte si incazzi, con gli apici doppi, forse e' un problema degli escape
esa, non so, comunque con gli apici singoli funge.
Comunque, un modo piu' elegante anche se forse lievemente meno
performante e' usare le classi, trovi tutto quanto nelle infopages di
gawk.
ciao
- -- 
oggei
gpg --keyserver 
keys.indymedia.org
 --recv-keys eebb4d0d
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)
iD8DBQE/y4gPZmjYv+67TQ0RAkxEAJwJuuRDkwEqLDwfzyYN71NdHjBjDACeNiSy
+DliBL5Kh8n3yRak2k3QzBM=
=7Zd2
-----END PGP SIGNATURE-----

 esa, non so, comunque con gli apici singoli funge.
Il problema e' questo (e per evitare dei bug veramente difficili da trovare
sara' meglio di leggere il tutto con molta attenzione):
"\x0" significa di avere un NUL character dentro lo string che si passa alla
funzione preg_replace(). [qui ci vuole una pausa di un minuto]
"\\x0" invece e' uguale a '\x0' perche' con '' il \ non viene interpretato
come 'escaped'. Ed un nul character non piace proprio al compilatore preg.
Adesso quando scrivi ad esempio \057 ed intendi / succede che nella stringa
hai in realta' un singolo / e non la stringa di 4 caratteri: \057. Ed anche su
questo il compilatore preg avrebbe qualche obiezione da fare se usi / come
limiter (stesso succede chiaramente con altri caratteri speciali delle preg).
Il \ in una stringa con apici doppi e' da trattare con molta attenzione...
soprattutto perche' l'espressione preg reinterpreta il codice \ a sua volta
(quindi una volta il php quando parsa la stringa, e una volta dal motore che
compila l'espressione regolare)
"/[\\x0-\\x1f]|[\\x7f-\\xff]/" o anche:
"/[\\x0-\\x1f\\x7f-\\xff]/" o solo:
"/[^\\x20-\\x7E]/" e chi se la sente con un mini
"/[^ -~]/"   <-- N.B. lo spazio
:-P
Un tipico errore sotto windows sono matching su cartelle:
  "/C:\tmp\null/" identico a "/C:\007mp\012ull/"
e sono solo \t \n \r che vengono sbagliati.
Situazione critica quando a volte si configura qualcosa al volo
cambiando ad esempio un path da ..\include in ..\newinclude
Nel caso unix funziona (per puro caso?), il \/ non viene interpretato come
una sequenza 'escaped':
  sarebbe cmq. meglio scrivere "/\\/tmp/"  al posto di "/\/tmp/"
I stessi criteri valgono anche per system(), eval() ecc.
Consiglio di ripassare anche 
http://it2.php.net/types.string
HTH, ora di meditare...

 HTH, ora di meditare...
jurgen++
here's my karmapoint.
ciao
- -- 
oggei
gpg --keyserver 
keys.indymedia.org
 --recv-keys eebb4d0d
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)
iD8DBQE/y8EtZmjYv+67TQ0RAj7AAJ9JdAfGGk0DcQOyXxrSZiDiVi1lrACfVX24
mtqEXbtC2w6lXI4SHfQL/0c=
=VN1F
-----END PGP SIGNATURE-----

 Francesco
ciao
Alesi_27

 here's my karmapoint.
Nice, lol ;-)