Правильная форма неопределенного артикля (a, an) в строках PHP - PullRequest
6 голосов
/ 26 августа 2010

Есть ли простой способ заменить / в строку для согласования со следующим словом - во многом так же, как 'S' работает в формате даты?

Ответы [ 6 ]

7 голосов
/ 21 августа 2013

Проверьте это, оно прошло мое собственное тестирование, кажется довольно солидным.

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

6 голосов
/ 26 августа 2010

Вы можете использовать регулярное выражение, чтобы поменять местами а / и в зависимости от того, что следует за ним.Более сложная часть на самом деле будет определять все случаи, в которых нужно поменяться местами - это сложнее, чем «если за ним следует гласная».

Когда использовать / an:

Используйте перед словами / аббревиатурами, которые начинаются с согласного звука;используйте перед словами / аббревиатурами, которые начинаются с гласного звука.Это основано на произношении, а не на орфографии.

Следовательно:

  • университет
  • час
  • молекула иттербия
  • желтая собака
  • U
  • M

Начало регулярного выражения для ее решения

$text = preg_replace("/(?=a|e|i|o|u|yt)a/", "an", $text);
6 голосов
/ 26 августа 2010

Попробуйте это:

$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 голосов
/ 26 августа 2010

не уверен, работает ли он в 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, за которым следует захваченная буква.

0 голосов
/ 06 декабря 2016

Я разветвил модуль, к которому обращается Luke Chavers, очистил его, исправил логическую ошибку и сделал его интегрируемым с помощью Composer ;с этим, вы можете вставить его в свой проект с помощью:

php composer.phar require thaumatic/indefinite-article

Исходный код на https://github.com/thaumatic/indefinite-article.

0 голосов
/ 17 декабря 2015

Я использовал ответ Люка Чавера, чтобы написать быстрый и неприятный фрагмент 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";
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...