Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/12/2007, 17h47   #1
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
Par défaut un float et rien d'autre

Avant de convertir une chaine en float via un cast (float), je veux être certain que le format de la chaine soit correcte.

Je n'accepte que :
- une chaine qui contient "entier(s).entier(s)" (test avec un preg_match)
- ou une chaine composée de caractères de 0 à 9 (j'utilise le ctype_digit qui fait ça simplement)

Code :
1
2
3
4
5
6
7
 
function str_is_a_float ($arg_str)
{
$pattern ='`([0-9]{0,}+[.]+[0-9]{0,})`'; // float only
if(!(preg_match($pattern, $arg_str)|ctype_digit($arg_str))) return (FALSE); // float only or integer only
return (TRUE);
}
preg_match va trouver "4.5", mais aussi "nimportequoi4.5" ou "4.5nimportequoi"

Je n'arrive pas a placer une assertion avant et arrière pour n'autoriser que mon motif et seulement lui seul !
gomodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 18h22   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Si j'ai bien compris, ce n'est pas une assertion qu'il faut chercher à placer ici mais purement et simplement les ancres de début (^)/fin de chaîne ($) (avec l'option D) :
Code :
$pattern ='`^(?:\d+[.])?\d+$`D';
Notez que [0-9] peut s'abréger par le symbole \d et {0,} par le quantifieur * (pourquoi suivi d'un autre quantifieur + ?).

Pourquoi faire un test supplémentaire avec ctype_digit puisque l'expression régulière pourrait le faire (par une alternative ou le quantifieur ? - {0,1} - par exemple). Attention, | est un opérateur de bit (ou logique sur les bits) et non l'opérateur logique ou (|| ou or mais sont de priorité différente).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 19h22   #3
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
L'option D n'apparait pas dans la doc php en ligne, c'est dommage (http://fr.php.net/manual/fr/referenc...ern.syntax.php)

Je faisait appel à ctype_digit en pensant qu'il était optimisé, plus rapide qu'un preg_match... mais apparement je me suis trompé.

Merci pour la réponse efficace
gomodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 20h02   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Si cette option est bien mentionnée dans la documentation mais à la page des options et non à celle de la syntaxe des masques : options de recherche. Ou encore dans le tutoriel d'initiation aux expressions régulières en PHP : Le modificateur D.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 22h49   #5
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
Pour info, la même version, mais qui autorise des réels (float) négatif :

Code :
$pattern ='`^(?:[-])?\d+(?:[.]\d+)?$`D';
gomodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h21.


 
 
 
 
Partenaires

Hébergement Web