有没有办法使用正则表达式根据位置替换字符串中的字符?
例如,对于我正在从事的项目,我的重写规则之一是“如果 o
是倒数第二个元音和偶数编号(从左到右计数)。”
所以,例如:
heabatoik
将变为heabatöik
(o
是倒数第二个元音,也是第四个元音)habatoik
不会改变(o
是倒数第二个元音,但却是第三个元音)
这可以在 PHP 中使用 preg_replace
吗?
最佳答案
从主题字符串的开头开始,您想要匹配 2n + 1 个元音后跟一个 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');
要执行相同但对于奇数 o
,匹配 2n 个前导元音而不是 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');
如果一个不匹配,那么它不会执行任何替换,因此如果您正在尝试按顺序运行它们是安全的。
关于php - 根据字符串中的位置替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2177935/