带有foreach循环的preg_match

时间:2016-01-02 07:07:53

标签: php regex

我有文本文件,它包含以零开头的数字。

我想逐行检查该文件,该数字包含10位数字,第一个数字为零。为此我使用了此正则表达式^[0][0-9]{0,9}$

文字文件结构:

0123456781
0123456782
0123456783
0123456784

PHP代码:

$array = explode("\n", file_get_contents('numbers.txt'));   
像这样{p> $array
 Array ( [0] => 0123456781 [1] => 0123456782 [2] => 0123456783 [3] => 0123456784 )

foreach ($array as $key => $value) {
            if (preg_match("/^[0][0-9]{0,9}$/", $value))
                print_r($value);
        }

我需要显示与我的正则表达式匹配的所有数字。但它只显示最后一个数字。

4 个答案:

答案 0 :(得分:2)

您可以使用preg_grep file函数来完成此操作而无需循环:

$valids = preg_grep('/^0\d{9}\R?$/', file("data.txt"));

print_r($valids);

这将输出文件data.txt中包含正则表达式为09 digits的匹配行的所有行。

\R?$用于处理DOS文件结尾的输入文件。

答案 1 :(得分:2)

您可以简单地使用preg-grep()file()

来代替循环播放数组。
$match = preg_grep('/^[0][0-9]{0,9}$/', str_replace(array("\r", "\n"), '', file("numbers.txt")));

str_replace将删除所有换行和无回报的空格。您的$match现在将是numbers.txt中与您匹配的所有元素的数组。

答案 2 :(得分:1)

您需要trim $value,因为它最后可能有空格或换行符。

foreach ($array as $key => $value) {
    if (preg_match("/^0[0-9]{0,9}$/", trim($value)))
        print_r($value);
}

答案 3 :(得分:1)

  

我想逐行检查该文件,该数字包含10位数字,第一个数字为零。

你的问题是你的正则表达式:

"/^[0][0-9]{0,9}$/"

需要

"/^[0][0-9]{9}$/"

接下来,为了修剪你的数组,你可以这样做:

$trimmed_array=array_map('trim', $array);
foreach ($trimmed_array as $key => $value) {
    ...
}