在PHP开发中,我们经常需要从一个数组中筛选出符合特定条件的元素。array_filter() 是处理这种需求的利器,而当你希望进行更复杂的匹配(例如模式识别、关键字过滤等)时,正则表达式(Regular Expression)就能派上用场了。
本文将介绍如何使用 array_filter() 搭配正则表达式,实现更灵活的数组匹配与过滤。
array_filter() 是 PHP 提供的一个内置函数,用于根据回调函数的返回值来过滤数组中的元素。其基本语法如下:
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
$array:要过滤的原始数组。
$callback:用于测试数组每个值的回调函数,返回 true 的保留,返回 false 的被剔除。
$mode:可选,用于指定是传入键值、键名还是两者。
如果不传递 $callback,array_filter() 会移除数组中等价于 false 的值(如 0、false、''、null 等)。
以下是几个典型的场景,我们将使用 array_filter() 配合 preg_match()(正则匹配函数)来完成过滤操作。
假设我们有一个 URL 列表,希望找出包含 login 字段的链接:
$urls = [
'https://m66.net/login',
'https://m66.net/register',
'https://m66.net/user/profile',
'https://m66.net/logout',
'https://m66.net/help/login-guide'
];
$filtered = array_filter($urls, function($url) {
return preg_match('/login/i', $url);
});
print_r($filtered);
输出结果:
Array
(
[0] => https://m66.net/login
[4] => https://m66.net/help/login-guide
)
说明:/login/i 表示匹配不区分大小写的 “login”。
$data = [
'john@example.com',
'https://m66.net/contact',
'not-an-email',
'user@domain.net',
'hello@m66.net'
];
$emails = array_filter($data, function($item) {
return preg_match('/^[\w\.-]+@[\w\.-]+\.\w{2,}$/', $item);
});
print_r($emails);
输出结果:
Array
(
[0] => john@example.com
[3] => user@domain.net
[4] => hello@m66.net
)
$items = ['123start', 'alpha', '42beta', 'm66.net', '99bottles'];
$startsWithDigit = array_filter($items, function($str) {
return preg_match('/^\d/', $str);
});
print_r($startsWithDigit);
输出结果:
Array
(
[0] => 123start
[2] => 42beta
[4] => 99bottles
)
你还可以通过正则表达式的组合来构建更复杂的匹配逻辑。例如,匹配既包含 “login” 又以 .net 结尾的 URL:
$urls = [
'https://m66.net/login',
'https://m66.net/login-help.net',
'https://m66.net/home',
'https://m66.net/logout',
'https://m66.net/login/info'
];
$matched = array_filter($urls, function($url) {
return preg_match('/login.*\.net$/i', $url);
});
print_r($matched);
正则表达式效率问题:复杂的正则表达式在处理大型数组时可能影响性能,建议缓存中间结果或优化表达式。
Unicode 字符匹配:需要开启 u 修饰符,如 /pattern/u。
处理多维数组:对于多维数组,array_filter() 默认只处理一维。如果需要更深层次的过滤,可以使用递归函数处理。
通过将 array_filter() 与 preg_match() 相结合,PHP 开发者可以轻松地实现复杂的数组过滤逻辑。这种方法不仅语法简洁,而且执行效率较高,适用于数据清洗、输入验证、URL 过滤等多种场景。
掌握好这一技巧,将大大提升你在实际项目中的数据处理能力!