在PHP字符串中正确形式的不定冠词(a,an)

时间:2010-08-26 14:34:06

标签: php string cakephp

是否有一种简单的方法可以用字符串中的/ a替换以下单词 - 与“S”在日期格式中的工作方式非常相似?

e.g。

$apple = 'apple';
$pear = 'pear';
echo "This is a $apple, this is a $pear."

--> This is an apple, this is a pear

6 个答案:

答案 0 :(得分:7)

检查一下,它通过了我自己的测试,看起来很稳固。

https://github.com/Kaivosukeltaja/php-indefinite-article

答案 1 :(得分:6)

试试这个:

$l = array('a apple is a fruit', 'a banana is also a fruit');

foreach($l as $s) {
  $s = preg_replace('/(^| )a ([aeiouAEIOU])/', '$1an $2', $s);
  echo $s,"\n";
}

输出:

an apple is a fruit
a banana is also a fruit

答案 2 :(得分:6)

您可以使用正则表达式来交换a /,具体取决于它后面的内容。更棘手的部分实际上将定义所有要交换的案例 - 它比'如果它后跟元音'更复杂。

何时使用/ an:

使用以辅音声音开头的之前的单词/缩写;使用以元音开头的单词/缩写词。这是基于发音而不是拼写。

因此:

  • 大学
  • 一小时
  • 镱分子
  • 一只黄狗
  • a U
  • 一个M

开始使用正则表达式解决问题

$text = preg_replace("/(?=a|e|i|o|u|yt)a/", "an", $text);

答案 3 :(得分:2)

不确定它是否在PHP中工作,但一个非常简单的解决方案是:

$string = preg_replace('/\ba\b\s([aeiou])/',   'an $1', $string);
$string = preg_replace('/\ban\b\s([^aeiou])/', 'an $1', $string);

(不确定a / a规则,因为德语中没有这样的规则,我通常使用听起来更好的规则)

说明:

\ b是单词边界,所以\ ba \ b查找单词a,后跟空格和其中一个字母[aeiou]。这封信被捕获到1美元,表达式被替换为an,然后是被捕获的信件。

答案 4 :(得分:0)

我用Luke Chaver的答案写了一个快速而讨厌的php片段来处理这个

<?php
//code inspired by https://github.com/Kaivosukeltaja/php-indefinite-article/blob/master/IndefiniteArticle.class.php
global $indef_A_abbrev, $indef_A_y_cons, $indef_A_explicit_an, $indef_A_ordinal_an, $indef_A_ordinal_a;

$indef_A_abbrev = "(?! FJO | [HLMNS]Y.  | RY[EO] | SQU
          | ( F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU])
            [FHLMNRSX][A-Z]
        ";
$indef_A_y_cons = 'y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt)';
$indef_A_explicit_an = "euler|hour(?!i)|heir|honest|hono";
$indef_A_ordinal_an = "[aefhilmnorsx]-?th";
$indef_A_ordinal_a = "[bcdgjkpqtuvwyz]-?th";

function indefinite_article($input){
    global $indef_A_abbrev, $indef_A_y_cons, $indef_A_explicit_an, $indef_A_ordinal_an, $indef_A_ordinal_a;
    $word = preg_replace("^\s*(.*)\s*^", "$1", $input);
    if(preg_match("/^[8](\d+)?/", $word)) {
        return "an $word";
    }
    if(preg_match("/^[1][1](\d+)?/", $word) || (preg_match("/^[1][8](\d+)?/", $word))) {
        if(strlen(preg_replace(array("/\s/", "/,/", "/\.(\d+)?/"), '', $word))%3 == 2) {
            return "an $word";
        }
    }
    if(preg_match("/^(".$indef_A_ordinal_a.")/i", $word))       return "a $word";
    if(preg_match("/^(".$indef_A_ordinal_an.")/i", $word))      return "an $word";
    if(preg_match("/^(".$indef_A_explicit_an.")/i", $word))         return "an $word";
    if(preg_match("/^[aefhilmnorsx]$/i", $word))        return "an $word";
    if(preg_match("/^[bcdgjkpqtuvwyz]$/i", $word))      return "a $word";
    if(preg_match("/^(".$indef_A_abbrev.")/x", $word))          return "an $word";
    if(preg_match("/^[aefhilmnorsx][.-]/i", $word))         return "an $word";
    if(preg_match("/^[a-z][.-]/i", $word))          return "a $word";
    if(preg_match("/^[^aeiouy]/i", $word))                  return "a $word";
    if(preg_match("/^e[uw]/i", $word))                      return "a $word";
    if(preg_match("/^onc?e\b/i", $word))                    return "a $word";
    if(preg_match("/^uni([^nmd]|mo)/i", $word))     return "a $word";
    if(preg_match("/^ut[th]/i", $word))                     return "an $word";
    if(preg_match("/^u[bcfhjkqrst][aeiou]/i", $word))   return "a $word";
    if(preg_match("/^U[NK][AIEO]?/", $word))                return "a $word";
    if(preg_match("/^[aeiou]/i", $word))            return "an $word";
    if(preg_match("/^(".$indef_A_y_cons.")/i", $word))  return "an $word";
    return "a $word";
}

$words = array(
    "historical",
    "hour",
    "wholesale",
    "administrator",
    "inner circle"
);
foreach ($words as $word) {
    echo indefinite_article($word);
    echo "\n";
}

?>

答案 5 :(得分:0)

我已经分享了Luke Chavers所指的模块,清理它,修复逻辑错误并使用Composer使其可集成;安装完成后,您可以使用以下命令将其拉入项目:

php composer.phar require thaumatic/indefinite-article

源代码位于https://github.com/thaumatic/indefinite-article