0

以下のように関数を使用している関数を使用してpreg_replaceいます:

function replace($pattern, $replacement, $subject){
    preg_replace("/^$pattern$/", $replacement, $subject);
}

replace('(\w+)/((\w+)/)?', 'name=\1&family=\2', 'Jame/');

関数を編集することができずreplace、引数で何かをする必要があります。
ご覧のとおり、2 番目のパターン((\w+)/)?はオプションであり、存在しない場合があります。familyパターンが存在しない場合に no で結果を得る方法があるのだろうか、それ\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/');

もう 1 つの方法は、すべてのパーツを一致させてから、2 番目の配列で名前を付けることですが、一致した数に基づいてその配列をスライスします。どのフィールドで置換を行うかによって少し異なります。

于 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 に答える