2011-12-06 2 views
-1

J'essaie d'utiliser une instruction if pour déterminer si une certaine variable dans PHP ($ phone) correspond à une expression régulière. Il y a trois options différentes - soit il le passe correctement, c'est une valeur plutôt correcte et nécessite juste de légères modifications, et finalement, c'est une valeur erronée et devrait retourner à la page précédente avec un message d'erreur. Voici ce que j'ai jusqu'à présent:Une fonction pour tester une expression régulière et changer le texte si elle ne correspond pas

EDIT: La valeur attendue de $ phone est soit 123-456-7890, 1234567890, soit (123) 456-7890. L'entrée souhaitée pour la base de données est 123-456-7890

if (preg_match("/^\d{3}-\d{3}-\d{4}$/", $phone)) { 
    // This is the 100% correct version 
} 
else if (preg_match("/^\d{10}$/", $phone)) { 
    $phone = preg_replace("/^(.{3})/", "-", $phone); 
    $phone = preg_replace("/^(.{6})/", "-", $phone); 
// This is one of the mostly correct - this does not seem to work. I got a value of -37 when I tried to use it 
} 
else if (preg_match("/^\(\d{3}\) \d{3}-\d{4}$/", $phone)) { 
    // Have not tried anything here, because the problems here are similar to the else if statement above 
} 
else { 
    header('Location: '.$admin.'?error=phone'); 
// This should direct back to the previous page with an error message. 
} 

EDIT 2: Ok j'ai le cas et les ifs d'autre travail, mais l'autre ne redirige pas revenir à l'insertion de la page ou la prévention dans le base de données. Comment puis-je faire cela?

+0

Mmmm, vous devriez nous dire au moins ce qui est l'entrée ('de phone' de $) et ce qui est la sortie attendue ... –

Répondre

1

Que diriez-vous:

$phone = preg_replace("/^(\d{3})(\d{3})/", "$1-$2-", $phone); 

et pour la deuxième

$phone = preg_replace("/^\((\d{3})\) /", "$1-", $phone); 

Explication:

/   : regex delimiter 
^   : start of the string 
(\d{3}) : group 1 capture 3 digits 
(\d{3}) : group 2 capture 3 next digits 
/

pièce de rechange:

$1  : value captured in group 1 (the first 3 digits) 
-   : a dash 
$2  : value captured in group 2 (the next 3 digits) 
-   : a dash 

Pour traiter tous les cas de test, je ferais:

// Remove all non digit 
$phone = preg_replace('/\D+/', '', $phone); 
// then we must have a 10 digit number 
if (preg_match('/^\d{10}$/', $phone) { 
    $phone = preg_replace("/^(\d{3})(\d{3})/", "$1-$2-", $phone); 
} else { 
    // error 
} 
+0

Pouvez-vous expliquer ce que le expressions régulières font dans chaque cas? Je ne suis pas sûr de savoir ce que signifie "$ 1- $ 2-". –

+0

Aussi oui, cela a fonctionné. –

+0

@Andrew Alexander: voir ma mise à jour. – Toto

1

suffit de le faire en une seule regex, avec quelque chose comme ça et regex preg_replace.

\(?(\d{3})[)-]?\s?(\d{3})-?(\d{4}) 

Une explication de l'expression rationnelle (le plus probable peut être améliorée):

\(? // Optionally match the left parenthesis 
(\d{3}) // Match 3 digits, capture those digits into backreference #1 
[)-]? // Optionally match one of the characters: right parenthesis or dash 
\s?  // Optionally match a space 
(\d{3}) // Match 3 digits, capture those digits into backreference #2 
-?  // Optionally match the dash 
(\d{4}) // Match 4 digits, capture those digits into backreference #3 

Et une explication du remplacement:

$1-$2-$3 

Cela signifie de prendre les valeurs capturées à partir de la au-dessus des références arrières et placez-les dans la ficelle, chacun séparé par des tirets. Voir le demo pour voir qu'il passe tous les cas de test.

Edit: Pour détecter un format non valide, il suffit de cocher pour vous assurer que ce que vous obtenez en retour du remplacement est au format valide, comme ceci:

$replace = preg_replace('#\(?(\d{3})[)-]?\s?(\d{3})-?(\d{4})#i', '$1-$2-$3', $test); 
if(!preg_match('/\d{3}-\d{3}-\d{4}/', $replace)) 
{ 
    // Redirect 
} 
+0

Et l'instruction else? –

+0

@AndrewAlexander - Facile! Vérifiez le retour du remplacement pour voir si c'est dans le format attendu. J'ai ajouté un exemple et mis à jour la démo, qui ne nécessite plus que deux regex et n'utilise pas plusieurs appels à 'preg_match' ou' preg_replace'. – nickb

0

Vous pouvez essayer quelque chose comme ceci:

$phone = '(555) 555-5555'; 

//ONLY CHECK IF IT DOESNT MATCH 
if (!preg_match('/^\d{3}-\d{3}-\d{4}$/', $phone)) 
{ 
    //CHECK FOR SOLID 10 NUMBERS 
    if(preg_match('/^\d{10}$/', $phone)) 
    { 
    preg_match('/^(\d{3})(\d{3})(\d{4})$/', $phone, $matches); 
    $phone = $matches[1].'-'.$matches[2].'-'.$matches[3]; 
    } 
    //CHECK FOR BRACKET/DASH VERSION 
    elseif(preg_match('/^\(\d{3}\)\ \d{3}-\d{4}$/', $phone)) 
    { 
    preg_match('/^\((\d{3})\) (\d{3})-(\d{4})$/i', $phone, $matches); 
    $phone = $matches[1].'-'.$matches[2].'-'.$matches[3]; 
    } 
    else 
    { 
    header('Location: '.$admin.'?error=phone'); 
    } 
} 

echo $phone; 

Une version plus petite est:

//ONLY CHECK IF IT DOESNT MATCH 
if (!preg_match('/^\d{3}-\d{3}-\d{4}$/', $phone)) 
{ 
    if(preg_match('/^(?:\((\d{3})\) (\d{3})-(\d{4}))|(?:(\d{3})(\d{3})(\d{4}))$/', $phone, $matches)) 
    { 
    if(!empty($matches[1])) 
    { 
     $phone = $matches[1].'-'.$matches[2].'-'.$matches[3]; 
    } 
    else 
    { 
     $phone = $matches[4].'-'.$matches[5].'-'.$matches[6]; 
    } 
    } 
    else 
    { 
    header('Location: '.$admin.'?error=phone'); 
    } 
} 
0

Voici une fonction testée montrant comment je le ferais:

// Return tidied up 10 digit US phone number or FALSE if invalid. 
function validateAndTidyPhoneNumber($text) { 
    $re = '/ # Match loosely formatted US phone number. 
     ^   # Anchor to start of string. 
     \s*   # Allow leading whitespace. 
     \(?   # First digit set may be inside(). 
     ([0-9]{3}) # $1: 3 digits (1st set). 
     \)?   # First digit set may be inside(). 
     [ -]*  # Allow space or dash separators. 
     ([0-9]{3}) # $2: 3 digits (2nd set). 
     [ -]*  # Allow space or dash separators. 
     ([0-9]{4}) # $3: 4 digits (3rd set). 
     \s*   # Allow trailing whitespace. 
     $   # Anchor to end of string. 
     /ix'; 
    // Tidy up phone number. 
    $text = preg_replace($re, '$1-$2-$3', $text); 
    // Return tidied-up phone number if in correct format. 
    if (preg_match('/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/', $text)) { 
     return $text; 
    } 
    return FALSE; // Otherwise bad phone number. 
} 
Questions connexes