Как заменить слова поэтапно, чтобы получить желаемый результат?

краткое

Привет. Я просто не могу получить желаемый результат. Поэтому я разделил проблему на части, чтобы решить. Если конечно кто-то решит. Если вообще
это возможно. У меня есть текст и три массива. Необходимо заменить в три этапа, чтобы решить проблему.

Примеры:

$array_for_step1 = array // Array for 1-st step
(
"ewery day"     => "every day",
"to school"       => "to univer",
);

$array_for_step2 = array // Array for 2-nd step
(
'I',
'go',
'metro',
);

$array_for_step3 = array // Array for last 3-rd step
(
"my"   => "he",
"metro"  => "bus",
);

Введите текст:

$input = "Ewery day I go To SchooL with metro. My friend too go to school but without metro.";

Комментарии к этапам принятия решения:

Шаг 1:

Здесь необходимо заменить ключи массива их значениями в тексте. Форма ввода текста после 1-го шага заменяется массивом $array_for_step1:

Выделенный жирным шрифтом — измененные слова в тексте.

Каждый день я пойду Для UniveR с метро. Мой друг тоже иди Для UniveR но без метро.

Шаг 2:

Выделенный жирным шрифтом — слова, которые не нужно заменять на следующем шаге

Здесь вам нужно найти слова из массива и выделить их из текста, чтобы они не заменялись или не были доступны для замены для третьего шага. Ввести текстовую форму после 2-го шага заменить, используя массив `$ array_for_step2`:

Каждый день я пойду UniveR с метро. Мой друг тоже идти Для UniveR, но без метро.

Шаг 3:

Здесь необходимо заменить ключи массива их значениями в тексте. Ввести текстовую форму после 3-го шага заменить с помощью массива $array_for_step3:

Выделенный жирным шрифтом — выделены те слова, которые не изменены.

Каждый день я иду в UniveR с метро. мой друг тоже идет в UniveR но без метро.

Конечный результат:

"Every day I go To UniveR with metro. My friend too go To UniveR but without metro."

Мой пример функции для замены ключей массива для определения любых строковых случаев:

function ReplKeyToValue($request, $dictionary) // $request = string && $dictionary associative array
{
$request = str_replace($search, $replace, $request); // replace special letters to default cyrillic letters

$result = preg_replace_callback("/\pL+/u", function ($m) use ($dictionary) {
$word = mb_strtolower($m[0]);
if (isset($dictionary[$word])) {
$repl = $dictionary[$word];
// Check for some common ways of upper/lower case
// 1. all lower case
if ($word === $m[0]) return $repl;
// 2. all upper case
if (mb_strtoupper($word) === $m[0]) return mb_strtoupper($repl);
// 3. Only first letters are upper case
if (mb_convert_case($word,  MB_CASE_TITLE) === $m[0]) return mb_convert_case($repl,  MB_CASE_TITLE);
// Otherwise: check each character whether it should be upper or lower case
for ($i = 0, $len = mb_strlen($word); $i < $len; ++$i) {
$mixed[] = mb_substr($word, $i, 1) === mb_substr($m[0], $i, 1)
? mb_substr($repl, $i, 1)
: mb_strtoupper(mb_substr($repl, $i, 1));
}
return implode("", $mixed);
}
return $m[0]; // Nothing changes
}, $request);return $result;
}

Я привел пример текста и значения массива на английском языке. Но это так, что вы можете легко решить и понять. Но мне нужно, чтобы ваше решение работало для кириллического текста и массива.

1

Решение

Я вставляю код для вашей справки на языке Perl для этой самой задачи.

use strict;

my $text = "Ewery day I go To SchooL with metro. My friend too go to school but without metro.";

#Applying Regex Search and Replace for the 1st hash.
my %hash1 = (

"ewery day" => "every day",
"to school" => "to univer",
);

for my $key_hash1(keys %hash1){

if($text =~ m/\Q$key_hash1\E/ig){
$text =~ s/$key_hash1/$hash1{$key_hash1}/ig;
}
}

print "Result after 1st task:".$text."\n";

#2nd and 3rd Task

my @array2 = ('I','go','metro');

my %hash2 = (

"my" => "he",
"metro" => "bus",
);

for my $key_hash2(keys %hash2){

if ( grep(/^\Q$key_hash2\E$/, @array2 ) ) {
#print "$key_hash2 already present in the exceptional array\n";
next;
}
else{
#print "Replace in text $key_hash2 with $hash2{$key_hash2}\n";
$text =~ s/$key_hash2/$hash2{$key_hash2}/ig;
}
}
print "Result after 2nd task:".$text."\n";

Вы можете играть с ним по следующему адресу — Кодовая ссылка

-1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector