Правильная форма неопределенной статьи (a, an) в строках PHP

Есть ли простой способ подставить a / an в строке, чтобы согласиться со следующим словом – во многом так же, как способ «S» работает в формате Date?

например

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

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

 $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 

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

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

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

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

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

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

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

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

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

не уверен, что он работает на PHP таким образом, но очень простым решением будет:

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

(Не уверен в правиле a / an, поскольку в нем нет такого правила, и я обычно использую тот, который звучит лучше)

Объяснение:

\ b – граница слова, поэтому \ ba \ b ищет слово a, а затем пробел и одну из букв [aeiou]. Буква зафиксирована до $ 1, и выражение заменяется an последующее запечатленное письмо.

Я использовал ответ Люка Чавера, чтобы написать быстрый и неприятный фрагмент 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][AZ] "; $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("/^[az][.-]/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"; } ?> 

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

 php composer.phar require thaumatic/indefinite-article 

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