Newsgroup: it.comp.www.php
Titolo: Impazzire su una regexp ...

Ormai ho perso ogni speranza!
Devo fare un modo che una stringa possa contenere solo:
caratteri alfanumerici
spazi
.
,
@
-
'
In caso contrario, devo visualizzare un errore.
Ho quindi scritto:
if(!preg_match("/^[\w\s\.,-@']+$/", $stringa)) {
	errore();
}
Tutto bene, ma in un _solo_ caso non funziona: quando cioč nella
stringa č presente un apostrofo .... Sottolineo che la stringa non
č, come nell'esempio, scritta da me, ma č un valore che mi arriva da
form (provare per credere: fate passare la stringa
pinco'pallo
da un form e leggetela in $HTTP_POST_VARS !)
Ho fatto parecchie prove e mi sono reso contro che c'entra il maledetto
"magic_quotes", che non fa altro che inserirmi un bel \ davanti
all'apostrofo: quindi la regexp fallisce perchč trova la backslash (e
non il povero apostrofo!): e purtroppo non lo posso impostare a Off ...
L'unico rimedio che ho trovato č questa schifezzuola [1]:
/* magic_quotes workaround: */
if(preg_match("/\'/", $stringa)) { 	// Sosttuibile anche con strstr()
	$stringa = str_replace("\\", "", $stringa); 
}       
Mal che vada tengo questo, perņ sospetto che mi stia perdendo nel classico
bicchiere d'acqua ......
Ciao
--ev
[1] che peraltro mi lascia passare \' .... 

Prova cosě:
if(!preg_match("/^[a-zA-Z.,@-' ]+$/", $stringa)) {
errore();
}
Ciao, Luca

 }
Provo al volo ....
Niente da fare: "Compilation failed : range out of order in character
class at offset 13 in mioscript."
Perň non capisco la differenza con la mia regexp:
\w č uguale a [a-zA-Z0-9]
e
\s č uguale a " " (lo spazio bianco)
;-)
Ciao
--ev

 if(!preg_match("/^[\w\s\.,-@']+$/", $stringa)) {
il '-' non deve essere in mezzo ad un set di caratteri (indica un range di
caratteri)... O escaparla con \ oppure mettere al inizio o alla fine.

	errore();
Questa regexp, scusa se te lo dico, funziona solo per scommessa.
1) Gli escape sono singoli. Quindi alla regexp arrivano solo perche' in
   PHP \w e \s non hanno significato. Dovresti scrivere \\w e \\s.
2) C'e' un "-" fra , e @: questo viene letto come "caratteri da , a @".
   E quindi ti accetta anche <>. E' questo che vuoi? Se si', bene. E se
   no, scrivi ",\\-@" anziche' ",-@".
In breve, io vedrei meglio:
	/^([\\w\\s\\.,\\-@]|\\\\*')+$/
Leonardo
-- 
Nior thainig ar major i dtus an lae chugainn,
is ni rabhamar fein ann i gcoir na gceart
ach mar sheolfai aoireacht bo gan aoire,
ar thaobh na greine de Sliabh na mBan.

Ho quindi scritto:
Prova questa funzione:
function is_alphanumeric($string, $min_length = 0, $max_length = 0)
{
    $ret = _is_valid($string, $min_length,$max_length,"[[:alnum:]]+");
    return($ret);
}
e il controllo lo fai cosě:
if (!is_alphanumeric($tua stringa, 4, 20)) {
	$errore= "";
}
 Fammi sapere!
Ciao.
Cristian.

 	/^([\\w\\s\\.,\\-@]|\\\\*')+$/
Ho provato ma sono sempre al punto di partenza: mi lascia passare anche
la sequenza \' ...
Cmq, la funzione incriminata è questa:
 
function check_invalid_chars($fields_to_check, $re, $invalid_chars_err_msg) {
	$invalid_fields = array();
	while(list($icfk, $icfv) = each ($fields_to_check)) {
		$icfv = trim($icfv);
		if(!empty($icfv)) {
			if(!preg_match($re, $icfv)) {
				$invalid_fields[$icfk] = $icfv;
			}
		}
	}
	if(count($invalid_fields) > 0) {
		print "$invalid_chars_err_msg<br>\n";
		print "<ul>\n";
		while(list($invalid_fields_key, $invalid_fields_value) = each ($invalid_fields)) {
			print "<li>$invalid_fields_key (<b>".stripslashes($invalid_fields_value)."</b>)</li>\n";
		}
		print "</ul>\n";
	declare_error();
	back();
	die();
	}
}			
che richiamo con:
check_invalid_chars($HTTP_POST_VARS, "/[\w\s\.,\-@']/", "Errore");
Altre idee sono ben accette! :-)
Ciao
--ev

la sequenza \' ...
Infatti! Non era quella che VOLEVI fare passare? C'e' un'eccezione apposta
nella regexp. Se "\'" NON deve passare, allora la regexp e'
	/^([\\w\\s\\.,\\-@'])+$/
(ho tolto "|\\\\*'"... che infatti significa "oppure ' preceduto da zero o
piu' \\").


 	/^([\\w\\s\\.,\\-@'])+$/
Qui hai tutto il diritto di venirmi a pestare a sangue ma: addirittura
mi blocca TUTTI i ' (ma anche i \'!).
Inizio a pensare che il problema nasca dal passare alla mia funzione
(quella del post precedente) direttamente $HTTP_POST_VARS ...
Che dici? 
Ciao
--ev

mi blocca TUTTI i ' (ma anche i \'!).
Infatti, ho sbagliato. Quella regexp specifica ' genericamente e lo blocca,
mentre quella prima faceva passare \'. Sono passato da un estremo all'altro
nella foga :-)
Per far passare ', A MENO CHE sia preceduto da \, bisogna mettere:
	/^([\\w\\s\\.,\\-@]|[^\\\\]')+$/
("tutti i caratteri di prima, meno '") oppure ("non-\ seguito da '").
#!/usr/local/bin/php -q
<?
        $expr = "/^([\\w\\s\\.,\\-@]|[^\\\\]')+$/";
        if (!preg_match($expr, $argv[1]))
                print "$argv[1] does not match.\n";
        else
                print "$argv[1] is OK.\n";
?>
./test.php "aida"
aida is OK.
./test.php "ai'da"
ai'da is OK.
./test.php "ai\'da"	# E qui dovevo scrivere \\ [1]
ai\'da does not match.
[1] anche la bash ha gli stessi problemi del parser PHP 8-D


 	/^([\\w\\s\\.,\\-@]|[^\\\\]')+$/
E' lei!
Quanto ti devo? ;-)
Ciao
--ev

Quanto ti devo? ;-)
Dunque vediamo... IVA... ritenuta d'acconto... ritorsioni fiscali al 15%...
interessi semplici e composti... rompimento di 'oglioni...
...viene giusto giusto un caffe', se mai passi da queste parti :-).


 ...viene giusto giusto un caffe', se mai passi da queste parti :-).
Scherza, scherza, che il prosimo weekend sono (con alta probabilità!) a
FI! 
E posso pure prodigarmi per un cappuccino + brioche! :-)
Ciao
--ev