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" }
Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top