Bạn cần xem các quy tắc ngữ pháp cho mạo từ không xác định (chỉ có hai mạo từ không xác định trong ngữ pháp tiếng Anh - "a" và "an). Bạn có thể không đồng ý những âm này đúng, nhưng quy tắc ngữ pháp tiếng Anh rất rõ ràng :
"Các từ a và an là mạo từ không xác định. Chúng tôi sử dụng mạo từ bất định an trước các từ bắt đầu bằng một nguyên âm (a, e, i, o, u) và mạo từ không xác định a trước các từ bắt đầu bằng phụ âm (tất cả chữ cái khác). "
Lưu ý rằng điều này có nghĩa là một nguyên âm chứ không phải là một ký tự nguyên âm . Ví dụ: các từ bắt đầu bằng chữ "h" im lặng, chẳng hạn như "vinh dự" hoặc "người thừa kế" được coi là nguyên âm an nên được tiếp tục với "an" - ví dụ: "Rất vinh dự được gặp bạn". Các từ bắt đầu bằng một phụ âm có tiền tố là - đó là lý do tại sao bạn nói "a used car" chứ không phải "a used car" - bởi vì "used" có âm "yoose" chứ không phải "uhh".
Vì vậy, là một lập trình viên, đây là những quy tắc cần tuân theo. Bạn chỉ cần tìm ra cách xác định âm của một từ bắt đầu bằng âm gì, thay vì chữ cái gì. Tôi đã xem các ví dụ về điều này, chẳng hạn như ví dụ này trong PHP của Jaimie Sirovich:
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';
}
Có lẽ dễ nhất để tạo quy tắc và sau đó tạo danh sách các ngoại lệ và sử dụng quy tắc đó. Tôi không tưởng tượng sẽ có nhiều như vậy.