我正在使用一个使用preg_replace
函数的函数,如下所示:
function replace($pattern, $replacement, $subject){
preg_replace("/^$pattern$/", $replacement, $subject);
}
replace('(\w+)/((\w+)/)?', 'name=\1&family=\2', 'Jame/');
我无法编辑replace
函数,只能用参数做一些事情
如您所见,第二种模式((\w+)/)?
是可选的,可能不存在。我想知道如果模式不存在,是否有结果没有family
,这意味着\2
为空。
所以我应该:
'name=Jame'
注意
我不能改变preg_replace
签名或使用替代功能二人组合限制。寻找replacement pattern
如果存在。
答案 0 :(得分:5)
对于preg_replace
,请不要将其设为可选,将其设为明确。处理这两种情况:
$pattern = [
'((\w+)/(\w+)/)',
'((\w+)/)',
];
$replacement = [
'name=\1&family=\2',
'name=\1',
];
echo preg_replace($pattern, $replacement, 'Jame/');
另一种选择是匹配所有部分,然后给它们一个带有第二个数组的名称,但是根据匹配的数量对它进行切片。取决于您想要替换哪个字段。
答案 1 :(得分:1)
我想你应该试试preg_replace_callback
(http://php.net/manual/en/function.preg-replace-callback.php)。
$name = preg_replace_callback(
'/(\w+)\/(?:(\w+)\/)?/',
create_function(
'$matches',
'return "name={$matches[0]}" . ( !$matches[1] ? '' : "&family={$matches[1]}" );'
),
'Jame/'
);
此代码尚未经过测试......只是一个想法