Вам потрібно поглянути на граматичні правила для невизначених статей (в англійській граматиці є лише дві невизначені статті - "a" та "an). Ви можете не погодитися, що це звучить правильно, але правила граматики англійської мови дуже чіткі :
"Слова a і a - це невизначені артиклі. Ми використовуємо невизначений артикль перед словами, що починаються на голосний звук (a, e, i, o, u), а невизначений артикль - перед словами, що починаються на приголосний звук (усі інші листи). "
Зверніть увагу, що це означає голосний звук , а не голосну букву . Наприклад, слова, що починаються з мовчазного "h", такі як "честь" або "спадкоємець", розглядаються як голосні, а потім продовжуються з "an" - наприклад, "Це честь зустріти вас". Слова, що починаються на приголосний звук, мають префікс до - і саме тому ви говорите "вживаний автомобіль", а не "вживаний автомобіль", - оскільки "вживаний" має звук "йос", а не звук "ух".
Отже, як програміст, цих правил слід дотримуватися. Потрібно лише розробити спосіб визначення того, з якого звуку починається слово, а не з якої букви. Я бачив такі приклади, як цей у PHP Джеймі Сіровича:
function aOrAn($next_word)
{
$_an = array('hour', 'honest', 'heir', 'heirloom');
$_a = array('use', 'useless', 'user');
$_vowels = array('a','e','i','o','u');
$_endings = array('ly', 'ness', 'less', 'lessly', 'ing', 'ally', 'ially');
$_endings_regex = implode('|', $_endings);
$tmp = preg_match('#(.*?)(-| |$)#', $next_word, $captures);
$the_word = trim($captures[1]);
//$the_word = Format::trimString(Utils::pregGet('#(.*?)(-| |$)#', $next_word, 1));
$_an_regex = implode('|', $_an);
if (preg_match("#($_an_regex)($_endings_regex)#i", $the_word)) {
return 'an';
}
$_a_regex = implode('|', $_a);
if (preg_match("#($_a_regex)($_endings_regex)#i", $the_word)) {
return 'a';
}
if (in_array(strtolower($the_word{0}), $_vowels)) {
return 'an';
}
return 'a';
}
Напевно, найпростіше створити правило, а потім створити список винятків і використовувати його. Не думаю, що їх буде стільки.