2016-04-28 18 views
1

Also versuche ich eine Zeichenfolge, die eine Telefonnummer und eine Erweiterung enthält, zu teilen, da manchmal eine Erweiterung in der Zeichenfolge vorhanden ist. Dies ist mein Versuch:Zerlegung einer Zeichenfolge in eine Telefonnummer und Erweiterung mit preg_match

$tests[] = "941-751-6550 ext 2204"; 
$tests[] = "(941) 751-6550 ext 2204"; 
$tests[] = "(941)751-6550 ext 2204"; 
$tests[] = "9417516550 ext 2204"; 
$tests[] = "941-751-6550 e 2204"; 
$tests[] = "941-751-6550 ext 2204 "; 
$tests[] = "941-751-6550 extension 2204"; 
$tests[] = "941-751-6550 x2204"; 
$tests[] = "(941) 751-6550"; 
$tests[] = "(941)7516550"; 
$tests[] = "941-751-6550 "; 
$tests[] = "941-751-6550"; 

foreach ($tests as $test) { 
    preg_match('#([\(\)\s0-9\-]+)(.+$)#',$test,$matches); 
    $phone = preg_replace('#[\-\(\)\s]#','',$matches[1]); 
    $extension = preg_replace('#[^0-9]#','',$matches[2]); 
    if ($phone == '9417516550' 
     && ($extension == '2204' 
      || $extension == '0')) { 
       echo "PASS: phone: $phone ext: $extension<br />"; 
    } else { 
     echo "FAIL: phone: $phone ext: $extension<br />"; 
    } 
} 

Allerdings, wenn ich diese Tests laufen, um zu sehen, ob es richtig, die Telefonnummer und die Erweiterung teilt, erhalte ich die folgende Ausgabe:

PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
FAIL: phone: 941751655 ext: 0 
FAIL: phone: 941751655 ext: 0 
FAIL: phone: 9417516550 ext: 
FAIL: phone: 941751655 ext: 0 

Wie Sie sehen können, Es bricht, wenn ich eine Erweiterung ganz ausschließe (die letzten vier Tests). Wie kann ich die preg_match() Regex korrigieren, so dass die FAIL: ... Zeilen wie PASS: phone: 9417516550 ext: 0 aussehen?

+0

Musst du unbedingt regex verwenden? – GrumpyCrouton

+0

Ich denke, Sie können die Regex reduzieren, überprüfen Sie bitte meine Antwort. –

Antwort

2

(.+$) Mittel Das am Ende einer Zeile muss 1 oder mehr Symbol sein. Also, wenn Sie nichts nach der Telefonnummer haben - dann wird Ihre Telefonnummer um 1 Symbol reduziert.

Ich empfehle, (.*$) zu verwenden, was null oder mehr Symbole bedeutet.

+0

Das ist es! Ich habe deine Antwort akzeptiert, da du der Erste warst, der darauf hinwies, dass das nicht-gierige Matching die Lösung ist; der Rest ist nur Implementierungsdetail. –

1

Ich würde alles in der preg_match tun. Angenommen, die Zahlen sind nicht international. Ich denke, das würde funktionieren.

foreach ($tests as $test) { 
    preg_match('#\(?(\d{3})\)?[-\h]?(\d{3})[-\h]?(\d{4})\h*(?:e?x?t?(?:ension)?\h(\d+))?#',$test,$matches); 
    $phone = $matches[1] . $matches[2] . $matches[3]; 
    $extension = !empty($matches[4]) ? $matches[4] : 0; 
    if ($phone == '9417516550' 
     && ($extension == '2204' || $extension == '0')) { 
      echo "PASS: phone: $phone ext: $extension<br />"; 
    } else { 
     echo "FAIL: phone: $phone ext: $extension<br />"; 
    } 
} 

Demo: https://eval.in/561720
Regex101 Demo: https://regex101.com/r/mG9iD1/1

+0

Interessant, danke. Das ist sehr verschieden von dem, was ich versuchte, aber trotzdem aufgewertet. –

0

Von Ihnen Beispiel sieht es aus wie es schlägt fehl, wenn nichts als ext gefunden.

Eine Lösung ist zu werfen $extension wie dies in int:

$extension = intval($extension); //If nothing found will be 0 

Danach sind wir sicher, dass wir eine integer haben, und wir können die if-Anweisung ändern:

|| $extension === 0)) { 
1

Dies funktioniert wie erwartet, nur getestet.

foreach ($tests as $test) { 
    preg_match('#([\(\)0-9\-]+\s*[\(\)0-9\-]+)\s*(.*$)#',$test,$matches); 
    $phone = preg_replace('#[\-\(\)\s]#','',$matches[1]); 
    $extension = ($matches[2] == "") ? '0' : preg_replace('#[^0-9]#','',$matches[2]); 
    if ($phone == '9417516550' 
     && ($extension == '2204' 
      || $extension == '0')) { 
       echo "PASS: phone: $phone ext: $extension<br />\n"; 
    } else { 
     echo "FAIL: phone: $phone ext: $extension<br />\n"; 
    } 
} 

Mit minimalen Änderungen an Ihrem Code.

+0

Das funktioniert, upvoted und danke. Ich akzeptierte @u_mulders Antwort, als er zuerst auf die nicht-gierige Lösung stieß. –

+0

Ok, aber pass auf, ich habe ein wenig deine Regexp geändert, um ein Leerzeichen im Telefon und ein Leerzeichen zwischen Telefon und Nebenstelle zuzulassen, und füge das Ternär hinzu, um 0 zu bekommen, wenn keine Erweiterung vorhanden ist – lamp76

0
$pns = <<< LOL 
941-751-6550 ext 2204 
(941) 751-6550 ext 2204 
(941)751-6550 ext 2204 
9417516550 ext 2204 
941-751-6550 e 2204 
941-751-6550 ext 2204 
941-751-6550 extension 2204 
941-751-6550 x2204 
(941) 751-6550 
(941)7516550 
941-751-6550 
941-751-6550 
LOL; 

preg_match_all('/^([(\d)\-]+)\s?(?:e.*?|x.*?)?(\d+)?$/sim', $pns, $matches, PREG_PATTERN_ORDER); 
for ($i = 0; $i < count($matches[1]); $i++) { 
    $phone = preg_replace('#[\-\(\)\s]#','', $matches[1][$i]); 
    $extension = preg_replace('#[^0-9]#','', $matches[2][$i]); 
    if ($phone == '9417516550' && $extension == '2204') { 
      echo "PASS: phone: $phone ext: $extension\n"; 
    } else { 
      echo "FAIL: phone: $phone ext: 0\n"; 
    } 
} 

Ausgang:

PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
FAIL: phone: 9417516550 ext: 0 
FAIL: phone: 9417516550 ext: 0 
FAIL: phone: 9417516550 ext: 0 
FAIL: phone: 9417516550 ext: 0 

Ideone Demo

0

Ehrlich gesagt, sind Sie besser dran, die nicht-numerischen Zeichen Strippen, dann alles nach dem ersten Abspalten 10 als Erweiterung. Es ist konzeptuell äquivalent, aber einfacher und narrensicherer und effizienter als das Durchlaufen mehrerer Regexes, die von Natur aus langsam sind.

foreach($tests as $test){ 
    $phone = preg_replace("/[^0-9]/", "", $test); 
    $extension = substr($phone,10); 
    $phone = substr($phone,0,10); 
    if(empty($extension)){ 
     $extension = '0'; 
    } 
    if ($phone == '9417516550' 
     && ($extension == '2204' 
      || $extension == '0')) { 
       echo "PASS: phone: $phone ext: $extension<br />\n"; 
    } else { 
     echo "FAIL: phone: $phone ext: $extension<br />\n"; 
    } 
} 

Ausgang:

PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 2204 
PASS: phone: 9417516550 ext: 0 
PASS: phone: 9417516550 ext: 0 
PASS: phone: 9417516550 ext: 0 
PASS: phone: 9417516550 ext: 0