2009-09-09 4 views
0

Est-ce que quelqu'un sait pourquoi la fonction filter_var() ci-dessous génère l'avertissement? Y at-il une limite sur combien de caractères peuvent être dans une classe de caractères?Fonction filter_var() de PHP Génération d'avertissement

$regex = "/^[\w\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\072\073\074\075\076\077\100\133\134\135\136\140\173\174\175\176]*$/"; 

$string = "abc"; 

if(!filter_var($string, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>$regex)))) 
{ 
    echo "dirty"; 
} 

else 
{ 
    echo "clean"; 
} 

Attention: filter_var() [function.filter-var]: modificateur inconnu ':'

Répondre

3

Votre regex est interprété par PHP comme cette chaîne:

string '/^[\w!"#$%&'()*+,-./:;<=>[email protected][\]^`{|}~]*$/' (length=40) 

(utilisation var_dump $ regex, et vous l'obtiendrez)

Juste au milieu de votre regex, donc, il y a un slash; comme vous utilisez une barre oblique pour délimiter la regex (c'est le premier caractère de $regex), PHP pense que cette barre oblique au milieu marque la fin de l'expression rationnelle.

Ainsi, PHP pense que votre regex est en fait:

/^[\w!"#$%&'()*+,-./ 

Chaque personnage qui vient après la barre oblique de fin sont interprétées comme modifiers.

Et ':' n'est pas un modificateur valide.

Vous pouvez échapper à la barre au milieu de la regex ;-)
ainsi que quelques autres personnages, btw ...

Une solution pour cela peut-être utiliser la fonction preg_quote.

+0

Merci pour votre aide. Cela fonctionne maintenant que j'ai ajouté des antislashs en utilisant son code ASII "134". Je vais mettre l'expression rationnelle actuelle dans une autre réponse juste en dessous. – lanmind

+0

De rien :-) Une question me vient à l'esprit: pourquoi utilisez-vous des codes ASCII, et pas directement les caractères? Il serait plus facile de comprendre votre regex, de cette façon, ne pensez-vous pas? –

+0

J'ai pensé à ça trois secondes plus tôt, lol! La réponse est que j'ai utilisé le code ANCII du personnage de l'espace dans une regex avant et depuis, mon esprit me dit de le faire pour les caractères spéciaux. Je vais probablement changer mon chemin un jour:) – lanmind

0

Voici le regex travail actuel:

/^[\w\041\042\043\044\045\046\047\050\051\052\053\054\134\055\056\134\057\072\073\074\075\076\077\100\133\134\134\134\135\134\136\140\173\174\175\176]*$/i