php - 根据字符串中的位置替换

标签 php regex

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

例如,对于我正在从事的项目,我的重写规则之一是“如果 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/

相关文章:

php - 将 MYSQL 多边形转换为 PHP 中的文本

php - 如何使用 gmdate() 显示超过 24 小时,但不显示天数

ruby - 什么是 Ruby 正则表达式来匹配至少有一个句点且没有空格的字符串?

java - 如何验证 ER.RTR.RT12345 的 URL 模式?

regex - unix 中正则表达式的语法错误

regex - grep 多个模式单文件参数列表太长

php - 安装 browsercap.ini

php - 一次跟随一个从 PHP 数组返回的链接,并暂停

php - 如何在特定日期在 php 中发送?

java - 为什么这个正则表达式在 Java 而不是 Groovy