使用preg_replace'如果'pattern`不匹配,删除'replacement'

时间:2012-12-31 14:39:23

标签: php regex preg-replace

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

2 个答案:

答案 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/'
);

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