2016-07-07 2 views
2

Я пытаюсь добавить имена файлов с номерами телефонов в массиве. Мои тестовые файлы:php regex для извлечения телефонных номеров из имен файлов

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] ' равно '\ d' в' PCRE'. – Jan

+0

Попробуйте '$ regex ="/(?

ответ

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 ERROR 500 – Vlad

Смежные вопросы