PHP和正则表达式转换为“;a「;至;";在以元音开头的单词之前

PHP和正则表达式转换为“;a「;至;";在以元音开头的单词之前,php,regex,string,case,grammar,Php,Regex,String,Case,Grammar,我很惊讶我在网上任何地方都找不到这个,包括stackoverflow。我正在寻找在PHP函数preg_replace中使用的正则表达式来实现这一点: 查找文本中“a”后跟元音的任何部分,并按照英语语法规则将“a”转换为“an”。 例如: “一个苹果”将被转换为“一个苹果” “冰屋”将改为“冰屋” 等等等等 理想情况下,该函数不区分大小写。真正令人印象深刻的是,如果它能保留原来的大小写,例如,“A”将被转换为“An”,而下一个单词的大小写将被单独保留,例如,“一个美国人”将不会变成“一个美国人”

我很惊讶我在网上任何地方都找不到这个,包括stackoverflow。我正在寻找在PHP函数preg_replace中使用的正则表达式来实现这一点:

查找文本中“a”后跟元音的任何部分,并按照英语语法规则将“a”转换为“an”。

例如:

“一个苹果”将被转换为“一个苹果”

“冰屋”将改为“冰屋”

等等等等

理想情况下,该函数不区分大小写。真正令人印象深刻的是,如果它能保留原来的大小写,例如,“A”将被转换为“An”,而下一个单词的大小写将被单独保留,例如,“一个美国人”将不会变成“一个美国人”

这似乎正是正则表达式的理想用途,很多人都会觉得它很有用,但我不明白。我将非常感谢您的帮助

我目前正在尝试:

preg_replace("/ a?i ([aeio])?i/", "an $1", $string)

正如评论家们正确地指出的那样,这并不能完全解决a/an的问题,因为它是基于声音而不仅仅是字母的。然而,我仍然认为它在“每一点帮助”的基础上是值得的,因为它纠正了大多数此类问题,从而节省了一些人工编辑时间。

我的模式如下,尽管上面评论中的问题(re:u)要复杂得多

preg_replace('/\b(a)\s+([aeiou])/i', '$1n $2', $source_string);

当然,如果你是唯一的问题字母,你可以赌一把,并且在你接下来的情况下信任源字符串,只需将它从模式中删除:
/\b(a)\s+([aeio])/i

这是家庭作业还是娱乐项目?因为语法比这更复杂。“一本二手书”不应该是“一本二手书”。从另一方面来说,“一个诚实的人”应该变成“一个诚实的人”。啊,是的,美国问题取决于它的发音是“嗯”还是“你”,对吗?这很棘手。唯一的解决办法是编一本这样的单词的大词典,不是吗?
an
的使用完全取决于语音,而不是字母。例如:
一个8条腿的生物
。你到底想在这里干什么?用正则表达式修正语法?为什么?更好的解决办法是让这些人用英语打字?这是一个千载难逢的机会。。。字母u不是唯一有问题的。很荣幸能以这样的方式回答问题。谢谢,就这样。这是否有必要使其不区分大小写?preg_replace('/\ba([aeioAEIO])/','an$1',$string);我们知道这并不能完美地解决问题。正如我上面所说的,这只是为了修复一些错误。我仍然需要手动编辑结果,这只是节省了一点时间。这当然不是一个一刀切的解决方案。我更新了不区分大小写的答案(使用
I
修饰符和两个捕获,而不是一个捕获(以便用一个替换一个)