$word = "Acrobat" (or Apple, Tea etc.)
Как я могу обнаружить и повторить последний гласный данного слова с помощью php? Я пробовал функцию preg_match, google'd в течение нескольких часов, но не смог найти правильное решение.
В строке могут быть многобайтовые буквы, такие как ü, ö.
Вот многобайтовая безопасная версия, которая ловит последнюю гласную в строке.
$arr = array( 'Apple','Tea','Strng','queue', 'asartä','nő','ağır','NOËL','gør','æsc' ); /* these are the ones I found in character viewer in Mac so these vowels can be extended. don't forget to add both lower and upper case versions of new ones because personally I wouldn't rely on the i (case insensitive) flag in the pattern for multibyte characters. */ $vowels = 'aàáâãāăȧäảåǎȁąạḁẚầấẫẩằắẵẳǡǟǻậặæǽǣ' . 'AÀÁÂÃĀĂȦÄẢÅǍȀȂĄẠḀẦẤẪẨẰẮẴẲǠǞǺẬẶÆǼǢ' . 'EÈÉÊẼĒĔĖËẺĚȄȆẸȨĘḘḚỀẾỄỂḔḖỆḜ' . 'eèéêẽēĕėëẻěȅȇẹȩęḙḛềếễểḕḗệḝ' . 'IÌÍÎĨĪĬİÏỈǏỊĮȈȊḬḮ' . 'iìíîĩīĭıïỉǐịįȉȋḭḯ' . 'OÒÓÔÕŌŎȮÖỎŐǑȌȎƠǪỌØỒỐỖỔȰȪȬṌṐṒỜỚỠỞỢǬỘǾŒ' . 'oòóôõōŏȯöỏőǒȍȏơǫọøồốỗổȱȫȭṍṏṑṓờớỡởợǭộǿœ' . 'UÙÚÛŨŪŬÜỦŮŰǓȔȖƯỤṲŲṶṴṸṺǛǗǕǙỪỨỮỬỰ' . 'uùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửự' ; // set necessary encodings mb_internal_encoding('UTF-8'); mb_regex_encoding('UTF-8'); // and loop foreach ($arr as $word) { $vow = mb_ereg_replace('[^'.$vowels.']','',$word); // get rid of all consonants (non-vowels in this pattern) $lastVw = mb_substr($vow,-1); // and get the last one from the remaining vowels if (empty($lastVw)) // it evaluates this line when there's no vowel in the string echo "there's no vowel in <b>\"$word\"</b>." . PHP_EOL; else // and vice versa echo "last vowel in <b>\"$word\"</b> is " . "<span style=\"color:#F00\">{$lastVw}</span>" . PHP_EOL; }
Вот результат.
последний гласный в «Яблоке» – это
последний гласный в «Чае» – это
в «Strng» нет гласного.
последний гласный в «очереди» – это e
последний гласный в «асарте» – это
последний гласный в «nő» есть ő
последний гласный в «ağır» – это
последний гласный в «NOËL» равен Ë
последний гласный в «gør» – ø
последний гласный в «æsc» – æ
$word = "Acrobat"; $vowels = array_intersect(str_split($word), array('A','E','I','O','U','a','e','i','o','u')); echo array_pop($vowels);
function last_vowel($word) { for ($i = strlen($word) - 1; $i >= 0; --$i) { switch (strtolower($word[$i])) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'y': return $word[$i]; } } return null; } echo last_vowel("Apple");
используйте метод str_split ()
http://www.php.net/manual/en/function.str-split.php
это преобразует вашу строку в массив, тогда вы можете использовать индекс массива в поиске первой и последней буквы вашей строки.
-Array [0] – первая буква. * Массив [общее число букв – 1] – последняя буква.
После получения первого и последнего элементов массива начинается отображение. например: if (letter == "a" || letter == "A") echo "Apple";
и так далее…
Я бы сказал, что ответы Эд или Марка определенно более эффективны, но если вам нужен пример рекурсивной функции, то это:
$word = "stellar"; function lastVowel($word) { $vowels = array('a','e','i','o','u'); $letter = substr($word, strlen($word) - 1); if(in_array(strtolower($letter), $vowels)) return $letter; else { if(strlen($word) > 0) return lastVowel(substr($word, 0, strlen($word) - 1)); else return "no vowels"; } } echo lastVowel($word);
Имейте в виду, что есть лучшие способы сделать это. Просто давая конкретный пример, не обязательно «лучший».
Я лично использовал бы preg_match()
для этой задачи.
$arr = array( 'Apple','Tea','Strng','queue' ); foreach ($arr as $word) { preg_match('~[aeiou](?=[^aeiou]*$)~i',$word,$m); if (empty($m)) echo "there's no vowel in \"$word\"."; else echo "last vowel in \"$word\" is <b style=\"color:#F00\">{$m[0]}</b>"; echo PHP_EOL; }
Это приведет к выводу
последний гласный в «Яблоке» – это
последний гласный в «Чае» – это
в «Strng» нет гласного.
последний гласный в «очереди» – это e