有没有办法使用正则表达式替换基于位置的字符串中的字符?
例如,我正在处理的项目的一个重写规则是"替换o
为ö
if o
是倒数第二个元音,甚至编号(从左到右计数)."
所以,例如:
heabatoik
将成为heabatöik
(o
是倒数第二个元音,以及第四个元音)habatoik
不会改变(o
是倒数第二个元音,但是第三个元音)这可能preg_replace
在PHP中使用吗?
从主题字符串的开头开始,您希望匹配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)
如果一个不匹配,那么它不会执行替换,因此如果您正在尝试执行此操作,则可以安全地按顺序运行它们.