Olivier Masson
2009-12-18 21:45:35 UTC
Salut,
La fonction filter_sanitize_regexp n'existe pas (je dois dire que vu le
peu de possibilité, j'ai du mal à saisir l'intérêt des filter_*).
Je voulais simplement filtrer les caractères d'une chaine qui sont dans
une expression régulière.
En fait, j'ai une fonction qui peut soit valider, soit filtrer... comme
filter_* en fait, mais avec des filtres que j'ai prédéfini.
Or, ma fonction a un paramètre $filtre qui, s'il est TRUE, efface les
caractères qui ne colle pas avec la regexp.
J'ai réussi ce que je voulais faire, mais ça m'étonnerait qu'il n'existe
pas plus simple. J'ai eu beau chercher et tenter d'utiliser un peu
toutes les fonctions PHP dispo (sauf preg_filter qui n'est que pour >=
5.3), mais rien ne va.
Donc ça donne ça :
function regexp($type, $value, $filter=false){
switch($type) {
case "email":
$regex="/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/";
break;
case "md5":
$regex="/^[0-9a-f]{32}+$/";
break;
}
/* etc. Toutes mes def ; j'ai fait un switch comme j'aurais pu faire
autre chose */
$regex = preg_replace('`^\/\^`', '/', $regex, 1);
$regex = preg_replace('`\$\/`', '/', $regex, 1);
if(preg_match_all($regex, $value, $r)) {
$chaine = '';
foreach($r[0] as $value) {
echo '<p>'.$value.'</p>';
$chaine .= $value;
}
return $chaine;
}
}
else {
if (preg_match($regex, $value)) return false;
else return $message;
}
}
C'est super bourrin, notamment la concaténation de la sortie du
preg_match_all.
Autre chose : je n'ai pas trop compris pourquoi dans mon preg_replace je
ne pouvais pas simplement mettre preg_replace('`\$$`', '', $regex, 1)
(idem pour le ^).
Si vous avez pigé qq chose à mes explications, y a-t-il quelque chose de
moins moche ?
La fonction filter_sanitize_regexp n'existe pas (je dois dire que vu le
peu de possibilité, j'ai du mal à saisir l'intérêt des filter_*).
Je voulais simplement filtrer les caractères d'une chaine qui sont dans
une expression régulière.
En fait, j'ai une fonction qui peut soit valider, soit filtrer... comme
filter_* en fait, mais avec des filtres que j'ai prédéfini.
Or, ma fonction a un paramètre $filtre qui, s'il est TRUE, efface les
caractères qui ne colle pas avec la regexp.
J'ai réussi ce que je voulais faire, mais ça m'étonnerait qu'il n'existe
pas plus simple. J'ai eu beau chercher et tenter d'utiliser un peu
toutes les fonctions PHP dispo (sauf preg_filter qui n'est que pour >=
5.3), mais rien ne va.
Donc ça donne ça :
function regexp($type, $value, $filter=false){
switch($type) {
case "email":
$regex="/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/";
break;
case "md5":
$regex="/^[0-9a-f]{32}+$/";
break;
}
/* etc. Toutes mes def ; j'ai fait un switch comme j'aurais pu faire
autre chose */
$regex = preg_replace('`^\/\^`', '/', $regex, 1);
$regex = preg_replace('`\$\/`', '/', $regex, 1);
if(preg_match_all($regex, $value, $r)) {
$chaine = '';
foreach($r[0] as $value) {
echo '<p>'.$value.'</p>';
$chaine .= $value;
}
return $chaine;
}
}
else {
if (preg_match($regex, $value)) return false;
else return $message;
}
}
C'est super bourrin, notamment la concaténation de la sortie du
preg_match_all.
Autre chose : je n'ai pas trop compris pourquoi dans mon preg_replace je
ne pouvais pas simplement mettre preg_replace('`\$$`', '', $regex, 1)
(idem pour le ^).
Si vous avez pigé qq chose à mes explications, y a-t-il quelque chose de
moins moche ?