对于那些没有用英语阅读手册的人,并且发现示例代码的返回值与文档中的返回值不一致
您需要在示例模式中添加修饰符“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']
?>
由于我必须使用 PHP 5.2.X 并需要 preg_filter,因此我编写了一个快速而肮脏的解决方法。
<?php
if (!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 ;
}
}
?>