Вам необходимо ознакомиться с грамматическими правилами для неопределенных артиклей (в английской грамматике есть только две неопределенные артикли - «a» и «an). Вы можете не согласиться, что это звучит правильно, но правила английской грамматики очень ясны :
"Слова a и an являются неопределенными артиклями. Мы используем неопределенный артикль перед словами, которые начинаются с гласного звука (a, e, i, o, u), и неопределенный артикль a перед словами, которые начинаются с согласного звука (все другие буквы) ".
Обратите внимание, это означает гласный звук , а не гласную букву. . Например, слова, начинающиеся с молчаливого «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]);
$_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';
}
Вероятно, проще всего создать правило, а затем создать список исключений и использовать его. Не думаю, что их будет так много.