对于那些阅读非英语手册并发现示例代码的返回值与文档中不一致的人
你需要在示例模式中添加修饰符“u”才能获得相同的结果
<?php
$subject = array('1', 'а', '2', 'б', '3', 'А', 'Б', '4');
// 添加了 "u"
$pattern = array('/\d/u', '/[а-я]/u', '/[1а]/u');
$replace = array('А:$0', 'Б:$0', 'В:$0');
?>
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
preg_filter — 执行正则表达式搜索和替换
$pattern
,$replacement
,$subject
,$limit
= -1,&$count
= null
preg_filter() 与 preg_replace() 相同,只是它只返回存在匹配项的(可能已转换的)主题。有关此函数工作方式的详细信息,请阅读 preg_replace() 文档。
参数在 preg_replace() 的文档中进行了描述。
如果传递的正则表达式模式无法编译成有效的正则表达式,则会发出 E_WARNING
。
示例 #1 比较 preg_filter() 和 preg_replace() 的示例
<?php
$subject = array('1', 'a', '2', 'b', '3', 'A', 'B', '4');
$pattern = array('/\d/', '/[a-z]/', '/[1a]/');
$replace = array('A:$0', 'B:$0', 'C:$0');
echo "preg_filter 返回值\n";
print_r(preg_filter($pattern, $replace, $subject));
echo "preg_replace 返回值\n";
print_r(preg_replace($pattern, $replace, $subject));
?>
以上示例将输出
preg_filter returns Array ( [0] => A:C:1 [1] => B:C:a [2] => A:2 [3] => B:b [4] => A:3 [7] => A:4 ) preg_replace returns Array ( [0] => A:C:1 [1] => B:C:a [2] => A:2 [3] => B:b [4] => A:3 [5] => A [6] => B [7] => A:4 )
对于那些阅读非英语手册并发现示例代码的返回值与文档中不一致的人
你需要在示例模式中添加修饰符“u”才能获得相同的结果
<?php
$subject = array('1', 'а', '2', 'б', '3', 'А', 'Б', '4');
// 添加了 "u"
$pattern = array('/\d/u', '/[а-я]/u', '/[1а]/u');
$replace = array('А:$0', 'Б:$0', 'В:$0');
?>
如果你不想实际替换匹配项,只想将数组过滤到匹配项,则将替换参数设置为 '$0'。
<?php
$subject = array('1', 'a', '2', 'b', '3', 'A', 'B', '4');
$result = preg_filter('/\d/', '$0', $subject); // ['1','2','3','4']
?>
由于我必须使用 PHP5.2.X 并需要 preg_filter,所以我编写了一个快速简便的解决方法。
<?php
如果 (!function_exists('preg_filter')) {
function preg_filter($pattern, $replace, $subject, $limit = -1 , &$count = null) {
if(!is_array($subject)) {
$noArray = 1 ;
$subject = array($subject);
}
$preg = preg_replace($pattern, $replace, $subject, $limit, &$count);
$diff = array_diff($preg, $subject);
if($noArray == 1) $diff = implode($diff) ;
return $diff ;
}
}
?>