PHP preg_match - ce qui ne va pas avec ce RegEx?
-
18-09-2019 - |
Question
Les valeurs seront dans ce format 123-123-123-12345 que je voudrais le preg_match travailler. Pouvez-vous voir un problème avec ce regex?
foreach($elem as $key=>$value) {
// Have tried this With and without the + before the $ as well
if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) {
echo "Yeah match Elm: ".$value."<br />";
} else {
echo "Boo Hoo Elm: '".$value."'<br />";
}
}
ont également essayé
/^\d{3}\-\d{3}\-\d{3}\-\d{5}+$/
//With and without the + before the $
Ils échouent avec Boo Hoo, (
EDIT:
var_dump($elem)
array(3) { [0]=> string(1) "c" [1]=> string(0) "" [2]=> string(36) "123-123-123-12345" }
La solution
Essayer ce code:
$value = '123-123-123-12345';
if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) {
echo "Yeah match Elm: ".$value."<br />";
} else {
echo "Boo Hoo Elm: '".$value."'<br />";
}
(Je ne sais pas le \
sont utiles - mais ils ne semblent pas causer de problème, dans ce cas particulier)
Je reçois:
Yeah match Elm: 123-123-123-12345
Et avec ceci:
$value = '123-123-1a-123';
Je reçois:
Boo Hoo Elm: '123-123-1a-123'
Le regex ne semble réellement fonctionner pour moi?
Pourriez-vous donner un peu plus de code? Ou peut-être utiliser:
var_dump($elem);
pourrait être utile, pour vérifier si elle contient vraiment ce que vous attendez?
Autres conseils
Pourriez-vous s'il vous plaît fournir un tableau de test avec les données (sérialisé serait le mieux) que je ne peux pas reproduire ce comportement.
$elem = array ('123-123-123-12345');
foreach($elem as $key=>$value) {
// Have tried this With and without the + before the $ as well
if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) {
echo "Yeah match Elm: ".$value."<br />";
} else {
echo "Boo Hoo Elm: '".$value."'<br />";
}
}
résultat: Oui Elm correspondent: 123-123-123-12345
De plus, les anti-slash ne sont pas nécessaires dans l'expression régulière. Les tirets ne doivent être échappé à [] groupes si elles ne sont pas le premier caractère ([-a-z] correspondrait « - OU a-z », mais [a-z] correspond à « un ou \ ou z »).
--- EDIT ---
Ok, donc la seule chose que je ne comprends pas est ce que l'encodage utilisez-vous?
string(36) "123-123-123-12345"
36 octets ... Le plus proche je suis arrivé est UTF-16, mais a obtenu seulement 34 octets. Alors, quel est l'encodage que vous utilisez?
Vous pouvez également essayer de convertir la chaîne en utf-8 avant correspondant à l'expression rationnelle. (Également essayer d'utiliser le 'u' paramètre dans l'expression rationnelle: '/ somreg \ d / u', après la conversion en utf-8)
Utilisez backslashes double. \
Ummmmmm ....
Dans votre édition, vous parlez de $ array et dans votre boucle sur les $ elem .
Serait-ce le problème?
Modifier: Par ailleurs, il y a quelque chose d'étrange avec vos données, je ne compte que 17 caractères alors pourquoi donne une chaîne (36)
Impossible de répliquer. Votre code fonctionne bien quand je le coller dans un fichier.
Depuis votre var_dump()
montre votre chaîne cible est de 35 octets pour une chaîne de 15 caractères, cependant, il ne semble que vous avez des problèmes d'encodage. Qu'est-ce qui se passe si vous exécutez le regex contre utf8_decode($value)
au lieu de $value
?