在php开发中,处理数组时经常需要筛选出符合特定正则规则的元素,比如筛选出所有符合邮箱格式的字符串、符合手机号规则的条目等,通过正则匹配结合数组过滤函数可以高效实现这个需求。

核心函数说明
实现这个功能主要用到两个核心函数,分别是array_filter和preg_match。
array_filter函数
该函数用于过滤数组中的元素,把输入数组中的每个值传到回调函数进行处理,只有回调函数返回true的元素才会被保留到结果数组中,语法格式如下:
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
preg_match函数
该函数用于执行一个正则表达式匹配,如果匹配成功返回1,没有匹配返回0,发生错误返回false,语法格式如下:
preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int|false
实现正则筛选数组的完整示例
下面以从数组中筛选出符合国内手机号格式的字符串为例,展示完整的实现代码:
<?php
// 待处理的原始数组
$originalArray = [
'13800138000',
'12345678901',
'15987654321',
'abc123',
'18611112222',
'手机号错误'
];
// 定义手机号正则规则,国内手机号以1开头,第二位是3-9,后面跟9位数字
$phonePattern = '/^1[3-9]d{9}$/';
// 使用array_filter结合preg_match筛选符合条件的元素
$filteredArray = array_filter($originalArray, function($item) use ($phonePattern) {
// 只处理字符串类型的元素,非字符串直接返回false
if (!is_string($item)) {
return false;
}
// 执行正则匹配,匹配成功返回true
return preg_match($phonePattern, $item) === 1;
});
// 重置数组索引,避免保留原数组的键名
$filteredArray = array_values($filteredArray);
// 输出筛选结果
echo '筛选后的手机号数组:' . PHP_EOL;
print_r($filteredArray);
?>
上述代码的执行结果如下:
筛选后的手机号数组:
Array
(
[0] => 13800138000
[1] => 15987654321
[2] => 18611112222
)
注意事项
- 正则规则需要根据实际需求准确编写,避免匹配范围过大或过小,比如匹配邮箱时要符合邮箱的标准格式规则。
- 使用
preg_match时建议用全等判断=== 1,因为该函数返回0表示无匹配,false表示执行出错,避免把错误情况判定为匹配成功。 - 如果原数组的键名不需要保留,可以用
array_values重置索引,让结果数组的键名从0开始连续排列。 - 如果数组中包含非字符串类型的元素,需要在回调函数中先判断类型,避免
preg_match传入非字符串参数产生警告。
其他使用场景示例
如果需要筛选出数组中所有包含数字的元素,可以调整正则规则实现:
<?php
$testArray = ['apple', 'banana123', 'orange', 'pear456', 'grape'];
// 匹配包含至少一个数字的元素
$pattern = '/d+/';
$result = array_filter($testArray, function($item) use ($pattern) {
return is_string($item) && preg_match($pattern, $item) === 1;
});
print_r($result);
?>
执行后会输出包含数字的数组元素:
Array
(
[1] => banana123
[3] => pear456
)
phparray_filter正则表达式preg_match修改时间:2026-06-09 14:27:22