我试图找到条件正则表达式的正确语法。我发现了另一个问题,但它似乎不适用于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
知道我该怎么办?
答案 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。
答案 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)