Привет. Я просто не могу получить желаемый результат. Поэтому я разделил проблему на части, чтобы решить. Если конечно кто-то решит. Если вообще
это возможно. У меня есть текст и три массива. Необходимо заменить в три этапа, чтобы решить проблему.
$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-го шага заменяется массивом $array_for_step1
:
Выделенный жирным шрифтом — измененные слова в тексте.
Каждый день я пойду Для UniveR с метро. Мой друг тоже иди Для UniveR но без метро.
Выделенный жирным шрифтом — слова, которые не нужно заменять на следующем шаге
Здесь вам нужно найти слова из массива и выделить их из текста, чтобы они не заменялись или не были доступны для замены для третьего шага. Ввести текстовую форму после 2-го шага заменить, используя массив `$ array_for_step2`:
Каждый день я пойду UniveR с метро. Мой друг тоже идти Для UniveR, но без метро.
Здесь необходимо заменить ключи массива их значениями в тексте. Ввести текстовую форму после 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;
}
Я привел пример текста и значения массива на английском языке. Но это так, что вы можете легко решить и понять. Но мне нужно, чтобы ваше решение работало для кириллического текста и массива.
Я вставляю код для вашей справки на языке 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";
Вы можете играть с ним по следующему адресу — Кодовая ссылка
Других решений пока нет …