2014-01-08 4 views
0

Я пытаюсь найти правильный синтаксис для условного регулярного выражения. Я нашел этот другой вопрос, но, похоже, он не работает на 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 

Любой идея, как я могу это сделать?

+1

использование 'preg_re place_callback' и написать 'return $ vMatch == 'V'? 'U': 'u'; ' –

ответ

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[1] для $match[3] вместо 2, 3 и 5.

[email protected]

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) 
Смежные вопросы