Как изменить регистр строки на основе другой строки? - PullRequest
0 голосов
/ 05 января 2020

Я работаю над " Вы имеете в виду ... " своего рода системой, похожей на Google! Часть орфографии тривиальна (с библиотекой PHP pspell), но я не могу решить проблему с регистром.

Допустим, слово с ошибкой написано "GoVeNMeNt", тогда правильное слово должно быть "GoVerNMeNt" "(аналогично Google), но библиотека pspell выдает предложения только в одном регистре (обычно в нижнем регистре).

Итак, как мне написать функцию transformCase, которая принимает фактическую строку ($string ) и строка предложения ($subject)? Я написал следующую реализацию, которая не обрабатывает все случаи:

function transformCase($string,$subject){
    for ($i=0,$marker=0;$i<strlen($string);++$i)
        if (strcasecmp($string[$i],$subject[$marker])==0){
            $subject[$marker]=$string[$i];
            $marker+=1;
        }
        elseif (strlen($string)==strlen($subject))
            $marker+=1;
    return $subject;
}
echo transformCase("AbSaNcE",'absence')."\n";  # AbSeNcE :)
echo transformCase("StRioNG",'string')."\n";   # StRiNG  :)
echo transformCase("GOVERMENt",'government')."\n"; # GOVERNment :<

В последнем случае вывод должен быть GOVERnMENt. Алгоритм также не работает с другими запросами.

Так что я был бы рад, если бы кто-нибудь помог мне с алгоритмом:)

1 Ответ

0 голосов
/ 06 января 2020

Попробуйте следующую модификацию вашего алгоритма:

function transformCase($string,$subject) {
    for ($i=0,$marker=0;$i<strlen($string);++$i) {
        if (strcasecmp($string[$i],$subject[$marker])==0) {
            $subject[$marker]=$string[$i];
            $marker+=1;
        }
        // Look for the next same character in $string
        while (strcasecmp($string[$i],$subject[$marker])!=0) {
            $i+=1;
        }
    }
    return $subject;
}

Сравнение elseif (strlen($string)==strlen($subject)) не гарантирует, что функция будет работать так, как вам нужно. В противном случае вы можете ввести дополнительные модификации для лучшей производительности.

...