php正则表达式从文件名中提取电话号码

php正则表达式从文件名中提取电话号码,php,regex,preg-match-all,Php,Regex,Preg Match All,我正在尝试在数组中添加带有电话号码的文件名。 我的测试文件是: 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

我正在尝试在数组中添加带有电话号码的文件名。 我的测试文件是:

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 ) )
为什么数组中只有一个文件名? 我的错在哪里?
提前谢谢你

您将文件名一次一个地传送到
preg\u match\u 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);
按注释更新:此版本创建一个key=>value数组,其中电话号码是键,值是包含该号码的所有文件名

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

一旦你有了这个数组,就可以轻松地将它展平为你想要的一维数组。

非常感谢!如何在同一阵列线中使用相同的电话号码获得结果?更新答案。我没有测试代码,但大纲是正确的。如果这个答案对您有效,请务必检查是否已被接受,谢谢!在我看来一切正常,但我得到HTTP错误500嘿,胡安,你能看看为什么会有HTTP错误500吗?@Vlad抱歉,不,我不能。也许我正在非对象上使用
empty()
?也许
!isset()
会工作得更好。但是
500错误
是不可能的模糊。如果您想知道真正的问题是什么,请在控制台而不是远程服务器上运行代码。然后,当代码崩溃时,可以打印调试信息并查看堆栈跟踪。祝你好运不是一个解决方案,而是一个提示。您的表达式可以简化为
~\D*\D{3}-\D{4}\D*~
-无需将
\D
放在字符类中,并且
[0-9]
等于
PCRE
中的
\D
。请尝试
$regex=“/(?)?