Как заставить функцию работать для парных слов?

Моя функция теперь работает только с одним словом. Например, у меня есть слова в ассоциативном массиве. И моя функция заменяет ключ массива его значением в тексте. И функция сохранения слов в нижнем регистре, но когда вы заменяете слова, он возвращает регистр входящих слов, который написан на тексте. Теперь функция не может работать с парами слов, чтобы заменить пары слов на другие пары слов.

Пример:

// 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 в начале.
  • когда логическое значение false и $m[0].$m[1] в нижнем регистре существует в ключах dict, затем установите логическое значение true и верните значение dict, else верните $m[0]
  • когда логическое значение true, установите значение false и верните пустую строку

Преимущество: вам не нужно заботиться о размере диктата. Используя ту же идею, вы можете даже расширить алгоритм до большего количества слов с небольшими изменениями или обработать dict, в котором клавиши элементов имеют различное количество слов.

Совет: когда вы думаете изменить лимит возврата или построить гигантское чередование, не делайте этого. Это означает, что ваш подход не является хорошим.