根据字符串中的位置替换

Chr*_*ris 7 php regex

有没有办法使用正则表达式替换基于位置的字符串中的字符?

例如,我正在处理的项目的一个重写规则是"替换oöif o是倒数第二个元音,甚至编号(从左到右计数)."

所以,例如:

  • heabatoik将成为heabatöik(o是倒数第二个元音,以及第四个元音)
  • habatoik不会改变(o是倒数第二个元音,但是第三个元音)

这可能preg_replace在PHP中使用吗?

Gre*_*con 8

从主题字符串的开头开始,您希望匹配2 n + 1个元音后跟a o,但前提o是后面跟着一个元音:

$str = preg_replace(
  '/^((?:(?:[^aeiou]*[aeiou]){2})*)' .  # 2n vowels, n >= 0
    '([^aeiou]*[aeiou][^aeiou]*)' .     # odd-numbered vowel
    'o' .                               # even-numbered vowel is o
    '(?=[^aeiou]*[aeiou][^aeiou]*$)/',  # exactly one more vowel
  '$1$2ö',
  'heaeafesebatoik');
Run Code Online (Sandbox Code Playgroud)

要做同样的但是对于奇数编号o,匹配2 n个前导元音而不是2 n + 1:

$str = preg_replace(
  '/^((?:(?:[^aeiou]*[aeiou]){2})*)' .  # 2n vowels, n >= 0
    '([^aeiou]*)' .                     # followed by non-vowels
    'o' .                               # odd-numbered vowel is o
    '(?=[^aeiou]*[aeiou][^aeiou]*$)/',  # exactly one more vowel
  '$1$2ö',
  'habatoik');
Run Code Online (Sandbox Code Playgroud)

如果一个不匹配,那么它不会执行替换,因此如果您正在尝试执行此操作,则可以安全地按顺序运行它们.