preg_replace()
和preg_filter()
有什么区别?
在什么情况下我应该使用其中一种而不是另一种?
我尝试阅读文档,但仍然不太明白其中的区别。
preg_filter
相对于preg_replace
的优点是你可以检查是否有任何内容被替换,因为如果没有任何内容被替换,preg_filter
返回null,而preg_replace
无论如何都会返回主题。
$subject = 'chips';
$pattern = '/chops/';
$replacement = 'flops';
if (is_null(preg_filter($pattern, $replacement, $subject)) { // true
// do something
}
echo preg_replace($pattern, $replacement, $subject); // 'chips'
preg_filter() 与 preg_replace() 相同,只是它只返回存在匹配的(可能已转换的)主题。有关此函数如何工作的详细信息,请阅读 preg_replace() 文档。
来自:这里
所以如果签名是
preg_filter ( mixed $pattern , mixed $replacement ,
mixed $subject [, int $limit = -1 [, int &$count ]] )
它将“转换”后的
$subject
参数(所有与 regex pattern
匹配的内容都替换)返回到数组中
这两个函数都可以处理字符串类型(好吧,标量类型值)输入或平面数组,并且主要设计用于返回字符串或数组类型数据——具体取决于输入数据类型。如果
preg_filter()
接收到一个字符串,但不满足正则表达式逻辑,那么 null
将被返回。无论使用哪个函数,如果出现错误,都会返回 null
。
preg_replace()
会改变数据,但没有删除元素的能力;使用 preg_filter()
的唯一原因是当您希望改变输入值并删除不受影响的值时。
preg_filter()
的行为类似于 preg_replace()
,然后是一个破坏性步骤,其中未更改的值要么从数组中删除,要么将字符串转换为 null
。与 preg_replace()
一样,preg_filter()
能够选择性地限制每个字符串的替换并计算整个过程中执行的替换次数。
数组测试:(演示)
$array = [
"💩 happens",
"I'm getting too old for this 💩",
"shiitake",
"Mondays are 💩, Tuesdays are 💩, and so on!",
"Here is your Finnish itinerary",
"Is this chocolate or 💩?"
];
var_export(
preg_filter('/💩/u', 'poop', $array, 1, $count) // parameters 4 and 5 are optional
);
echo "\n---\ncount: $count";
输出:
array (
0 => 'poop happens',
1 => 'I\'m getting too old for this poop',
3 => 'Mondays are poop, Tuesdays are 💩, and so on!',
5 => 'Is this chocolate or poop?',
)
---
count: 4
字符串测试:(演示)
var_export(
preg_filter('/💩/u', 'poop', "Mondays are 💩, Tuesdays are 💩, and so on!", 1, $count)
);
echo "\n---\ncount: $count\n===\n";
var_export(
preg_filter('/💩/u', 'poop', "shiitake", 1, $count)
);
echo "\n---\ncount: $count";
输出:
'Mondays are poop, Tuesdays are 💩, and so on!'
---
count: 1
===
NULL
---
count: 0