2016-07-07 60 views
2

我想添加電話號碼在數組中的文件名。 我的測試文件是:PHP的正則表達式從文件名中提取電話號碼

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

我的目標是不同的電話號碼將在數組元素單獨一行。陣列行中的每個元素將具有相同的電話號碼。 例如:

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

我的代碼:

$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); 

結果是

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

爲什麼只有陣列中的一個文件名? 我的錯誤在哪裏? 提前謝謝!

+0

不是一個解決方案,而是一個提示。你的表達式可以簡化爲'〜\ D * \ d {3} - \ d {4} \ D *〜' - 不需要在字符類中放入'\ D',並且'[0-9]'等於'PCRE'中的'\ d'。 – Jan

+0

試試'$ regex =「/(?<!\ d)[0-9] {3} - [0-9] {4}(?!\ d)/」;' –

回答

3

您正在將文件名提供給preg_match_all,並且每次都會覆蓋$result。事情是每次將$results[0]推到數組上,然後轉儲該數組。

$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); 

每評論更新:該版本創建密鑰=>值陣列,其中的電話號碼是鍵和值是所有包含該數量的文件名。

$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); 

一旦你有了這個數組,你可以很容易地將它壓扁成一個一維數組。

+0

非常感謝!任何想法如何在相同的數組行中有相同的電話號碼的結果? – Vlad

+0

已更新的答案。我沒有測試代碼,但大綱是正確的。如果這個答案適用於你,一定要檢查被接受,謝謝! –

+0

所有看起來不錯,但我得到HTTP錯誤500 – Vlad