pour filtrer des caractères indésirables, ou plutôt indiquer quels sont
ceux autorisés, j'utilise :
if (ereg('[^[:alnum:].&-$]',$chaine))
echo 'PAS BON';
else
echo 'OK';
Dans ce cas, pour n'autoriser que les chiffres, lettres ainsi que ., &,
- et $.
Ensuite, je me demandais si, avec des instructions de type str il
n'était pas possible de faire le même test plus rapidement.
pour filtrer des caractères indésirables, ou plutôt indiquer quels sont
ceux autorisés, j'utilise :
if (ereg('[^[:alnum:].&-$]',$chaine))
echo 'PAS BON';
else
echo 'OK';
Dans ce cas, pour n'autoriser que les chiffres, lettres ainsi que ., &,
- et $.
Ensuite, je me demandais si, avec des instructions de type str il
n'était pas possible de faire le même test plus rapidement.
pour filtrer des caractères indésirables, ou plutôt indiquer quels sont
ceux autorisés, j'utilise :
if (ereg('[^[:alnum:].&-$]',$chaine))
echo 'PAS BON';
else
echo 'OK';
Dans ce cas, pour n'autoriser que les chiffres, lettres ainsi que ., &,
- et $.
Ensuite, je me demandais si, avec des instructions de type str il
n'était pas possible de faire le même test plus rapidement.
2) inversement, la syntaxe « &-$ » signifie « n'importe quel caractère
compris entre « & » et « $ » (dans l'ordre ascii). Il est possible
que les fonctions ereg et preg traitent différemment ce cas invalide,
faisant ce que tu veux pour ereg et pas pour preg, ce qui pourrait
expliquer pourquoi tu n'y arrives pas avec preg_match.
2) inversement, la syntaxe « &-$ » signifie « n'importe quel caractère
compris entre « & » et « $ » (dans l'ordre ascii). Il est possible
que les fonctions ereg et preg traitent différemment ce cas invalide,
faisant ce que tu veux pour ereg et pas pour preg, ce qui pourrait
expliquer pourquoi tu n'y arrives pas avec preg_match.
2) inversement, la syntaxe « &-$ » signifie « n'importe quel caractère
compris entre « & » et « $ » (dans l'ordre ascii). Il est possible
que les fonctions ereg et preg traitent différemment ce cas invalide,
faisant ce que tu veux pour ereg et pas pour preg, ce qui pourrait
expliquer pourquoi tu n'y arrives pas avec preg_match.
Tout de suite deux remarques :
1) le caractère « . » n'est pas un caractère spécial dans un répertoire
de caractères entre crochets. Il est donc inutile de l'échapper avec
un « » ;
2) inversement, la syntaxe « &-$ » signifie « n'importe quel caractère
compris entre « & » et « $ » (dans l'ordre ascii). Il est possible
que les fonctions ereg et preg traitent différemment ce cas invalide,
faisant ce que tu veux pour ereg et pas pour preg, ce qui pourrait
expliquer pourquoi tu n'y arrives pas avec preg_match.
Par ailleurs, je n'aime pas trop me reposer sur la syntaxe [:alnum:],
par peur (probablement irrationnelle) qu'elle soit dépendante de la
locale utilisée. Tout ceci pour dire que moi j'écrirais ton test comme
suit : [^a-zA-Z0-9.&$-].
Avec preg_match :
if (preg_match('/[^a-zA-Z0-9.&$-]/',$chaine))
Peut-être avec <http://fr2.php.net/manual/fr/function.strcspn.php> mais
je ne suis pas sûr que le gain soit très important.
Tout de suite deux remarques :
1) le caractère « . » n'est pas un caractère spécial dans un répertoire
de caractères entre crochets. Il est donc inutile de l'échapper avec
un « » ;
2) inversement, la syntaxe « &-$ » signifie « n'importe quel caractère
compris entre « & » et « $ » (dans l'ordre ascii). Il est possible
que les fonctions ereg et preg traitent différemment ce cas invalide,
faisant ce que tu veux pour ereg et pas pour preg, ce qui pourrait
expliquer pourquoi tu n'y arrives pas avec preg_match.
Par ailleurs, je n'aime pas trop me reposer sur la syntaxe [:alnum:],
par peur (probablement irrationnelle) qu'elle soit dépendante de la
locale utilisée. Tout ceci pour dire que moi j'écrirais ton test comme
suit : [^a-zA-Z0-9.&$-].
Avec preg_match :
if (preg_match('/[^a-zA-Z0-9.&$-]/',$chaine))
Peut-être avec <http://fr2.php.net/manual/fr/function.strcspn.php> mais
je ne suis pas sûr que le gain soit très important.
Tout de suite deux remarques :
1) le caractère « . » n'est pas un caractère spécial dans un répertoire
de caractères entre crochets. Il est donc inutile de l'échapper avec
un « » ;
2) inversement, la syntaxe « &-$ » signifie « n'importe quel caractère
compris entre « & » et « $ » (dans l'ordre ascii). Il est possible
que les fonctions ereg et preg traitent différemment ce cas invalide,
faisant ce que tu veux pour ereg et pas pour preg, ce qui pourrait
expliquer pourquoi tu n'y arrives pas avec preg_match.
Par ailleurs, je n'aime pas trop me reposer sur la syntaxe [:alnum:],
par peur (probablement irrationnelle) qu'elle soit dépendante de la
locale utilisée. Tout ceci pour dire que moi j'écrirais ton test comme
suit : [^a-zA-Z0-9.&$-].
Avec preg_match :
if (preg_match('/[^a-zA-Z0-9.&$-]/',$chaine))
Peut-être avec <http://fr2.php.net/manual/fr/function.strcspn.php> mais
je ne suis pas sûr que le gain soit très important.
A ma grande surprise (surtout avec ce qu'on lit partout sur ereg/preg),
sur un bench de 100000 itérations avec des chaînes aléatoires de 10
caractères (pareil pour 20), le gain pour preg_match n'est pas toujours
positif ! Lorsqu'il [l']est (souvent tout de même), c'est assez faible
(quelques %).
Quant à strcspn, c'est toujours plus lent (10 à 20%).
A ma grande surprise (surtout avec ce qu'on lit partout sur ereg/preg),
sur un bench de 100000 itérations avec des chaînes aléatoires de 10
caractères (pareil pour 20), le gain pour preg_match n'est pas toujours
positif ! Lorsqu'il [l']est (souvent tout de même), c'est assez faible
(quelques %).
Quant à strcspn, c'est toujours plus lent (10 à 20%).
A ma grande surprise (surtout avec ce qu'on lit partout sur ereg/preg),
sur un bench de 100000 itérations avec des chaînes aléatoires de 10
caractères (pareil pour 20), le gain pour preg_match n'est pas toujours
positif ! Lorsqu'il [l']est (souvent tout de même), c'est assez faible
(quelques %).
Quant à strcspn, c'est toujours plus lent (10 à 20%).
Par ailleurs, je n'aime pas trop me reposer sur la syntaxe [:alnum:],
par peur (probablement irrationnelle) qu'elle soit dépendante de la
locale utilisée. Tout ceci pour dire que moi j'écrirais ton test comme
suit : [^a-zA-Z0-9.&$-].
Par ailleurs, je n'aime pas trop me reposer sur la syntaxe [:alnum:],
par peur (probablement irrationnelle) qu'elle soit dépendante de la
locale utilisée. Tout ceci pour dire que moi j'écrirais ton test comme
suit : [^a-zA-Z0-9.&$-].
Par ailleurs, je n'aime pas trop me reposer sur la syntaxe [:alnum:],
par peur (probablement irrationnelle) qu'elle soit dépendante de la
locale utilisée. Tout ceci pour dire que moi j'écrirais ton test comme
suit : [^a-zA-Z0-9.&$-].
Je ne sais pas s'est vrai en PHP, mais avec sed, a-zA-Z autorise aussi
les caractères accentués ET (curieusement) l'espace:
[...]
~tom$ dd if=/dev/random of=motus_clef bsQ2 count=2
~tom$ CLEF=$( sed -e 's/[^a-zA-Z0-9]//g' motus_clef )
~tom$ echo $CLEF
~tom$ óýÚÔÕìåßãèÖkÅAÌqéö9U3DäURlIÚrÇòÿ qcòRÝÁï½ÏZ9kíôÝOJòÕqu
ÀbFмÊhÿîmvÍÕCÆíú0çÔMQm7bWúhCí9z1ÕPgÖV9Rðq¼kçÀé31OçFzOuôGÎ2v
RXU˨ÅÔÛIðNúcá
~tom$ CLEF=${CLEF:0:32}
[...]
(debian Sarge,GNU sed version 4.1.2)
Je ne sais pas s'est vrai en PHP, mais avec sed, a-zA-Z autorise aussi
les caractères accentués ET (curieusement) l'espace:
[...]
~tom$ dd if=/dev/random of=motus_clef bsQ2 count=2
~tom$ CLEF=$( sed -e 's/[^a-zA-Z0-9]//g' motus_clef )
~tom$ echo $CLEF
~tom$ óýÚÔÕìåßãèÖkÅAÌqéö9U3DäURlIÚrÇòÿ qcòRÝÁï½ÏZ9kíôÝOJòÕqu
ÀbFмÊhÿîmvÍÕCÆíú0çÔMQm7bWúhCí9z1ÕPgÖV9Rðq¼kçÀé31OçFzOuôGÎ2v
RXU˨ÅÔÛIðNúcá
~tom$ CLEF=${CLEF:0:32}
[...]
(debian Sarge,GNU sed version 4.1.2)
Je ne sais pas s'est vrai en PHP, mais avec sed, a-zA-Z autorise aussi
les caractères accentués ET (curieusement) l'espace:
[...]
~tom$ dd if=/dev/random of=motus_clef bsQ2 count=2
~tom$ CLEF=$( sed -e 's/[^a-zA-Z0-9]//g' motus_clef )
~tom$ echo $CLEF
~tom$ óýÚÔÕìåßãèÖkÅAÌqéö9U3DäURlIÚrÇòÿ qcòRÝÁï½ÏZ9kíôÝOJòÕqu
ÀbFмÊhÿîmvÍÕCÆíú0çÔMQm7bWúhCí9z1ÕPgÖV9Rðq¼kçÀé31OçFzOuôGÎ2v
RXU˨ÅÔÛIðNúcá
~tom$ CLEF=${CLEF:0:32}
[...]
(debian Sarge,GNU sed version 4.1.2)
Je ne sais pas s'est vrai en PHP, mais avec sed, a-zA-Z autorise aussi
les caractères accentués ET (curieusement) l'espace:
Je n'ai *jamais* vu ça sur aucun Unix.[...]
(debian Sarge,GNU sed version 4.1.2)
Je ne sais pas s'est vrai en PHP, mais avec sed, a-zA-Z autorise aussi
les caractères accentués ET (curieusement) l'espace:
Je n'ai *jamais* vu ça sur aucun Unix.
[...]
(debian Sarge,GNU sed version 4.1.2)
Je ne sais pas s'est vrai en PHP, mais avec sed, a-zA-Z autorise aussi
les caractères accentués ET (curieusement) l'espace:
Je n'ai *jamais* vu ça sur aucun Unix.[...]
(debian Sarge,GNU sed version 4.1.2)
Quant à strcspn, c'est toujours plus lent (10 à 20%).
Là encore, rien de surprenant, puisque l'on remplace un test du genre
« si >= 'a' et <= 'z' » par un du genre « si == 'a' ou == 'b' ou == 'c'
ou == 'd' ou ... ou == 'y' ou == 'z' ».
Quant à strcspn, c'est toujours plus lent (10 à 20%).
Là encore, rien de surprenant, puisque l'on remplace un test du genre
« si >= 'a' et <= 'z' » par un du genre « si == 'a' ou == 'b' ou == 'c'
ou == 'd' ou ... ou == 'y' ou == 'z' ».
Quant à strcspn, c'est toujours plus lent (10 à 20%).
Là encore, rien de surprenant, puisque l'on remplace un test du genre
« si >= 'a' et <= 'z' » par un du genre « si == 'a' ou == 'b' ou == 'c'
ou == 'd' ou ... ou == 'y' ou == 'z' ».
J'allais répondre que les codeurs de PHP n'était pas bêtes et qu'ils
utiliseraient un tableau pour ne pas avoir à refaire le test à chaque
caractere.
[...]
Mais pourquoi le monde est il aussi cruel ?
Pourquoi le code n'est pas :
[...]
memset(isCharacterValid, 0, sizeof(isCharacterValid));
for (p = s1; p < s1_end; p++)
isCharacterValid[*p] = true;
[...]
J'allais répondre que les codeurs de PHP n'était pas bêtes et qu'ils
utiliseraient un tableau pour ne pas avoir à refaire le test à chaque
caractere.
[...]
Mais pourquoi le monde est il aussi cruel ?
Pourquoi le code n'est pas :
[...]
memset(isCharacterValid, 0, sizeof(isCharacterValid));
for (p = s1; p < s1_end; p++)
isCharacterValid[*p] = true;
[...]
J'allais répondre que les codeurs de PHP n'était pas bêtes et qu'ils
utiliseraient un tableau pour ne pas avoir à refaire le test à chaque
caractere.
[...]
Mais pourquoi le monde est il aussi cruel ?
Pourquoi le code n'est pas :
[...]
memset(isCharacterValid, 0, sizeof(isCharacterValid));
for (p = s1; p < s1_end; p++)
isCharacterValid[*p] = true;
[...]