Моя функция теперь работает только с одним словом. Например, у меня есть слова в ассоциативном массиве. И моя функция заменяет ключ массива его значением в тексте. И функция сохранения слов в нижнем регистре, но когда вы заменяете слова, он возвращает регистр входящих слов, который написан на тексте. Теперь функция не может работать с парами слов, чтобы заменить пары слов на другие пары слов.
// Function: function replaceKeyToValue($request, $dict){ $response = preg_replace_callback("/\pL+/u", function ($m) use ($dict) { $word = mb_strtolower($m[0]); if (isset($dict[$word])) { $repl = $dict[$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 $response; } // Example associative array $dict = array ( "make"=>"take", "cool"=>"pool", "узбек"=>"ӯзбек", ); $text = 'Make COOL узБЕК'; echo replaceKeyToValue($text, $dict);
Take POOL ӯзБЕК
Как будет переделана функция, чтобы она могла также соединять слова в пару слов?
$array = array ( "take pool" => "pool take", "get book" => "set word", "узбек точик" => "ӯзбек тоҷик" ); $example_text = "Take POOL Get BooK УзБеК ТоЧИК";
Первое: вытащите трансформацию вашего случая из проблемы и напишите специальную функцию для ее обработки.
О парах слов: вы можете решить проблему, используя:
Вам нужен только этот шаблон:
~\b\pL+\b(?=( \pL+\b)?)~u
Смотрище позволяет вести строку при каждом начале слова (даже в конце строки, поскольку (?=( \pL+\b)?)
Всегда является истинным утверждением .), Поскольку оно не потребляет никакого символа.
Это очень просто:
false
в начале. $m[0].$m[1]
в нижнем регистре существует в ключах dict, затем установите логическое значение true
и верните значение dict, else верните $m[0]
false
и верните пустую строку Преимущество: вам не нужно заботиться о размере диктата. Используя ту же идею, вы можете даже расширить алгоритм до большего количества слов с небольшими изменениями или обработать dict, в котором клавиши элементов имеют различное количество слов.
Совет: когда вы думаете изменить лимит возврата или построить гигантское чередование, не делайте этого. Это означает, что ваш подход не является хорошим.