2013-09-03 2 views
2

Je suis à la recherche de façons de faire correspondre une plage de caractères et supposé que le regEx suivant ne correspondrait qu'à des caractères dans la plage des codes hexadécimaux entre 20 et 7E. Cependant, il correspond aussi chr(10) (saut de ligne), en fait, les impressions suivantes « passés »:Comportement contre-intuitif preg_match - quel est le moyen le plus propre de faire correspondre une série de caractères?

echo preg_match("/^[\x20-\x7E]*$/", chr(10)) ? 'passed' : 'failed'; 

Toute idée pourquoi et comment faire correspondre cette gamme?

Répondre

2

chr (10) est en fin de ligne, vous devez donc ajouter modifier D.

Si ce modificateur est défini, un métacaractère dollar dans le motif correspond seulement à la fin de la chaîne sujet. Sans ce modificateur, un dollar correspond également immédiatement avant le caractère final s'il s'agit d'un saut de ligne (mais pas avant les autres sauts de ligne).

//        v 
echo preg_match("/^[\x20-\x7E]*$/D", chr(10)) ? 'passed' : 'failed'; 
//        ^
+2

... ou utilisez '\ A' et' \ Z' au lieu de '^' et '' $ à force d'ancrage au début et à la fin de la chaîne. –

+0

@TimPietzcker Néanmoins, M42 n'a-t-il pas raison de dire que l'étoile est optionnelle et que l'expression régulière passera non seulement pour les flux de formulaire mais comme 'chr (14)' même si vous avez utilisé \ A ou \ z? –

+1

@TimPietzcker, vous avez raison. Il est préférable d'utiliser \ A et \ z parce que le modèle serait indépendant de PHP. – sectus

Questions connexes