Replacing based on position in string

php, regex

Solution

Starting with the beginning of the subject string, you want to match 2n + 1 vowels followed by an `o`, but only if the `o` is followed by exactly one more vowel:

$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');

To do the same but for an odd-numbered `o`, match 2n leading vowels rather than 2n + 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');

If one doesn't match, then it performs no replacement, so it's safe to run them in sequence if that's what you're trying to do.

Problem

Is there a way using regex to replace characters in a string based on position? For instance, one of my rewrite rules for a project I’m working on is “replace `o` with `ö` if `o` is the next-to-last vowel and even numbered (counting left to right).” So, for example: - `heabatoik` would become `heabatöik` (`o` is the next-to-last vowel, as well as the fourth vowel) - `habatoik` would not change (`o` is the next-to-last vowel, but is the third vowel) Is this possible using `preg_replace` in PHP?

Original source