我的功能现在只能用一个单词。例如,我在关联数组中有单词。我的函数用文本中的值替换数组键。并且保持单词小写的功能,但是当你替换单词时,它将返回写在文本上的输入单词寄存器。现在,该函数不能与成对的单词一起使用,以用其他单词对替换单词对。
// 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 УзБеК ТоЧИК";
答案 0 :(得分:0)
首先:将你的案例转换推出问题并编写一个专门的函数来处理它。
关于单词对:您可以使用以下方法解决问题:
你只需要这种模式:
~\b\pL+\b(?=( \pL+\b)?)~u
前瞻允许在单词的每个开头处遍历字符串(即使在字符串的末尾,因为(?=( \pL+\b)?)
是始终为真的断言。)因为它没有&#t;消耗任何角色。
非常简单:
false
。$m[0].$m[1]
时,则将布尔值设置为true
并返回dict值,否则返回{{1 }} $m[0]
并返回空字符串优点:你不必关心字典大小。使用相同的想法,你甚至可以将算法扩展到更多的单词,几乎没有变化,或者处理一个项目键具有不同数量的单词的字典。
建议:当你想改变回溯限制或建立一个巨大的变化时,不要这样做。这只意味着你的方法不是好方法。