2016-07-07 17 views
2

Ich versuche, Dateinamen mit Telefonnummern in Array hinzuzufügen. Meine Testdateien sind:PHP Regex, um Telefonnummern aus Dateinamen zu extrahieren

dsfdsf543-6786sdfsdfd.jpg 
543-6786sdfsdfd.jpg 
435-3454 
dsfdsf543-6786.jpg 
123-4567 
543-6786.jpg 
345-3454 

Mein Ziel verschiedene Telefonnummern ist separate Zeile von Elementen in Array haben. Jedes Element in der Array-Zeile hat dieselbe Telefonnummer. Zum Beispiel:

543-6786 dsfdsf543-6786sdfsdfd.jpg 543-6786sdfsdfd.jpg dsfdsf543-6786.jpg 543-6786.jpg 
435-3454 
123-4567 
345-3454 

Mein Code:

$directory = $_SERVER['DOCUMENT_ROOT']; 
$handler = opendir($directory); 
while ($file = readdir($handler)) { 


    if ($file != "." && $file != "..") { 
     $regex = "/[\D]*[0-9]{3}-[0-9]{4}[\D]*/"; 
       preg_match_all($regex, $file, $results); 

    } 
} 
print_r ($results); 

Ergebnis ist

Array ([0] => Array ([0] => 345-3454)) 

warum nur ein Dateiname im Array? Wo ist mein Fehler? Vielen Dank im Voraus!

+0

Keine Lösung, aber ein Hinweis. Ihr Ausdruck kann vereinfacht werden zu '~ \ D * \ d {3} - \ d {4} \ D * ~' - es ist nicht notwendig, '\ D' in eine Zeichenklasse und' [0-9] 'zu setzen entspricht '\ d' in' PCRE'. – Jan

+0

Versuchen Sie '$ regex ="/(?

Antwort

3

Sie geben die Dateinamen preg_match_all nacheinander ein und jedes Mal wird $result überschrieben. Die Sache ist, jedes Mal $results[0] auf ein Array zu schieben und dann dieses Array auszugeben.

$final_results = []; 
while ($file = readdir($handler)) { 
    if ($file != "." && $file != "..") { 
     $regex = "/[\D]*[0-9]{3}-[0-9]{4}[\D]*/"; 
     if (preg_match_all($regex, $file, $results) > 0) 
      $final_results[] = $results[0] ; 
    } 
} 
print_r ($final_results); 

Aktualisiert pro Kommentar: Diese Version erstellt einen Schlüssel => Wert Array, in dem die Telefonnummer der Schlüssel und der Wert ist alle Dateinamen, die diese Zahl enthalten.

$final_results = []; 
while ($file = readdir($handler)) { 
    if ($file != "." && $file != "..") { 
     $regex = "/[\D]*[0-9]{3}-[0-9]{4}[\D]*/"; 
     if (preg_match_all($regex, $file, $results) > 0) { 
      if empty ($final_results[$results[0]]) { 
       $final_results[$results[0]] = $file ; 
      } else { 
       $final_results[results[0]] .= " ".$file ; 
      } 
     } 
    } 
} 
print_r ($final_results); 

Sobald Sie diese Array haben, ist es einfach leicht es zu einem eindimensionalen Array zu glätten, wie Sie wollen.

+0

Vielen Dank! Irgendwelche Gedanken, wie man Ergebnisse mit derselben Telefonnummer in der gleichen Reihenzeile hat? – Vlad

+0

Aktualisierte Antwort. Ich habe den Code nicht getestet, aber die Gliederung ist richtig. Wenn diese Antwort für Sie funktioniert, achten Sie darauf, als akzeptiert zu akzeptieren, danke! –

+0

alles sieht ok für mich aus, aber ich bekomme HTTP ERROR 500 – Vlad

Verwandte Themen