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?