Какой самый эффективный способ обнаружить и заменить последний гласный в строке? - PullRequest
1 голос
/ 26 июля 2011

У меня есть строка, которая содержит ряд случайных слов, разделенных запятыми:

worda,sample,wordb,another,extra,exampleb

Этот список всегда будет другим.

Какой самый эффективный способ заменить последнийгласный каждого слова с заданной переменной $?

Ответы [ 5 ]

3 голосов
/ 26 июля 2011
$vowel = array('a','e','i','o','u');
    $vowel = join('',$vowel);
    $str = "worda,sample,wordb,another,extra,exampleb";    

    $str = preg_replace("([{$str}]?(,|$))U","___$1",$str);     
2 голосов
/ 26 июля 2011

Простой, более эффективный способ ... регулярное выражение.Потребовалось немного поиграть, но он делает то, что вам нужно, если я правильно понимаю, что вам нужно.

<?php
$variable = "_";
$regexp = "/([aeiou]+)([^aeiou]*)(\,|$)/";
$string = "worda,sample,wordb,another,extra,exampleb";
$new_string = preg_replace($regexp, $variable."$2,", $string);
echo $new_string;   
?>

вывод: word_, sampl_, w_rdb, anoth_r, extr_, exampl_b,

2 голосов
/ 26 июля 2011

Это может дать вам некоторые идеи ...

    $replacement = '*';
    $string = 'super,cali,fragil,istic,expi,alido,cious';
    echo $string.'<br />';

    $vowels = array('a', 'e', 'i', 'o', 'u');
    $words = explode(',', $string);

    foreach($words as $word_key => $word)
    {
        $word = strrev($word);
        $chars = str_split($word);

        foreach($chars as $char_key => $char)
        {
            if(in_array($char, $vowels))
            {
                $word[$char_key] = $replacement;
                $words[$word_key] = strrev($word);
                continue(2);
            }
        }
    }

    $new_str = implode(',', $words);
    echo $new_str;die;

отредактировано для использования isset () вместо in_array () ...

    $replacement = '*';
    $string = 'super,cali,fragil,istic,expi,alido,cious';
    echo $string.'<br />';

    $vowels = array(
        'a' => 1,
        'e' => 1,
        'i' => 1,
        'o' => 1,
        'u' => 1
    );

    $words = explode(',', $string);

    foreach($words as $word_key => $word)
    {
        $word = strrev($word);
        $chars = str_split($word);

        foreach($chars as $char_key => $char)
        {
            if(isset($vowels[$char]))
            {
                $word[$char_key] = $replacement;
                $words[$word_key] = strrev($word);
                continue(2);
            }
        }
    }

    $new_str = implode(',', $words);
    echo $new_str;die;
1 голос
/ 26 июля 2011
<?php
$string = 'worda,sample,wordb,another,extra,exampleb,RFL';
$variable = 'replaced';
$vowels = array('a','e','i','o','u');

$words = explode(',',$string);

// for each word..
foreach($words as $index => $word)
{
    //this will be our new word, if there is a vowel found
    $new_word = '';

    for($char_index = strlen($word) - 1; $char_index > 0; $char_index--)
    {
        // the character we've selected; remember: a string is an array of characters
        $selected_char = $word[$char_index];

        // is the selected character in the vowels?
        if(in_array($selected_char,$vowels))
        {
            // find the last occurrence of the vowel we found
            $position = strrpos($word,$selected_char);

            // substr the first N characters before the vowel we found,
            // then add on the replacement and the last characters
            $new_word = substr($word,0,$position).str_replace($selected_char,$variable,substr($word,$position,strlen($word)));
            break;
        }
    }

    // since new_word will be string length > 0 for modifications, we replace it
    if(strlen($new_word) > 0)
    {
        $words[$index] = $new_word;
    }
}
?>
1 голос
/ 26 июля 2011

Поиск от конца строки к началу.Первый гласный, который вы встретите, вы замените переменной $.Затем продолжите и замените первый гласный, встречающийся после каждой запятой, на $ variable.

В PHP это должно быть что-то вроде:

function is_vowel($c)
{
  return $c == 'A' || $c == 'E' || $c == 'I' || $c == 'O' || $c == 'U' ||
         $c == 'a' || $c == 'e' || $c == 'i' || $c == 'o' || $c == 'u';
}

$s = 'some string';
$variable = 'replacement string';

$len = strlen($s);
$i = $len - 1;
$must_replace = true;
$result = '';
while ($i >= 0)
{
  $c = substr($s, $i, 1);
  if ($must_replace && is_vowel($c))
  {
    $must_replace = false;

    $result = $variable . $result;
  }
  else
  {
    $result = $c . $result;

    if ($c == ',')
    {
      $must_replace = true;
    }
  }

  $i = $i - 1;
}

Возможно, некоторые из шагов можно выполнить более эффективно, используяВстроенные функции PHP, но этот код должен дать идею предложенного алгоритма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...