0

我正在使用一个使用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是否存在。

4

2 回答 2

5

对于preg_replace,不要让它成为可选的,让它显式。处理两种情况:

$pattern     = [
    '((\w+)/(\w+)/)',
    '((\w+)/)',
];

$replacement = [
    'name=\1&family=\2',
    'name=\1',
];

echo preg_replace($pattern, $replacement, 'Jame/');

另一种选择是匹配所有部分,然后用第二个数组给它们一个名称,但根据匹配的数量对该数组进行切片。取决于您要在哪个字段中进行替换。

于 2012-12-31T14:47:28.167 回答
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/'
);

此代码尚未测试...只是一个想法

于 2012-12-31T14:43:11.707 回答