Question

$word = "Acrobat" (or Apple, Tea etc.)

How can I detect and echo the last vowel of a given word with php? I tried preg_match function, google'd for hours but couldn't find a proper solution.

There can be multibyte letters like ü, ö in the string.

Was it helpful?

Solution

Here's a multibyte safe version of catching the last vowel in a string.

$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;    
}

Here's the output.

last vowel in "Apple" is e
last vowel in "Tea" is a
there's no vowel in "Strng".
last vowel in "queue" is e
last vowel in "asartä" is ä
last vowel in "nő" is ő
last vowel in "ağır" is ı
last vowel in "NOËL" is Ë
last vowel in "gør" is ø
last vowel in "æsc" is æ

OTHER TIPS

$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");

use the method str_split()

http://www.php.net/manual/en/function.str-split.php

this will transform your string into an array then you can use the index of the array in finding the first and last letter of your string.

-Array[0] is the first letter *Array[total number of letters - 1] is the last letter.

After getting the first and last elements in the array, the mapping begins. eg: if(letter=="a"||letter=="A") echo "Apple";

and so on...

I would say Ed or Mark's answers are definitely more efficient, but if you want an example of a recursive function here it is:

$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);

Mind you, there are better ways to do this. Just giving a specific example, not necessarily the "best" one.

I would personally use preg_match() for this task.

$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;   
}

This will output

last vowel in "Apple" is e
last vowel in "Tea" is a
there's no vowel in "Strng".
last vowel in "queue" is e

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top