条件正则表达式保留匹配的情况

时间:2014-01-08 07:40:32

标签: php regex

我试图找到条件正则表达式的正确语法。我发现了另一个问题,但它似乎不适用于PHP。基本上,我有这样的话:

meva, meves, teva, teves, seva, seves

可以到达所有可能的案例变体(MEVA,Meva,meVa ......)。我想创建一个正则表达式来取代' v'通过' u,始终尊重' v'案件。要检测我使用:

(\b|_)(me|te|se)(?:(V)|(v))(a|es)(\b)

这部分似乎工作正常。但是当我必须创建替换v的表达式(meva - > meua,Meva - > Meua,meVa - > meUa ......)时,我无法正确地执行此操作:

\1\2(\3?"V":"v")\4\5 -> doesn't work

知道我该怎么办?

2 个答案:

答案 0 :(得分:1)

$input = "meva, meves, teva, teVes, seva, seves";    
echo preg_replace_callback("/(\b|_)(me|te|se)(?:(V)|(v))(a|es)(\b)/i",
        function ($match) {
            return $match[2] . ($match[3] == "V" ? "U" : "u") . $match[5];
        },
        $input);

//output: meua, meues, teua, teUes, seua, seues

您可以考虑重新排序捕获组:

(?:\b|_)(me|te|se)(V|v)(a|es)\b

这样,这些群组将在$ match-array中一个接一个地显示,因此您可以使用$match[1]$match[3]而不是2,3和5。

Example@ideone

答案 1 :(得分:0)

preg_replace_callback("/(\b|_)(m|t|s)e(v)(a|es)\b/i", function ($m) {
    return $m[1] . $m[2] . "e" . chr(ord($m[3]) - 1) . $m[3];
}, $str)