【发布时间】:2017-10-27 15:29:50
【问题描述】:
我的函数现在只能使用一个单词。例如,我在关联数组中有单词。我的函数用它在文本中的值替换了数组键。以及保持单词小写的功能,但是当您替换单词时,它将返回写入文本的传入单词寄存器。现在该功能不能使用成对的词来用其他成对的词替换成对的词。
示例:
// 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 УзБеК ТоЧИК";
【问题讨论】:
-
我 tried the code 但我得到
Make COOL узБЕК作为输出。 -
如果@WiktorStribiżew 没有答案,就没有答案:)
-
最后的
return声明应为return $response; -
如果您有
{ "A" => "ax", "B" => "bx", "A B" => "aa bb", "B A" => "x y" },那么您希望输入“A B A B A B A”变成什么? -
尝试用
"/(?<!\w)(?:" . implode('|', array_keys($dict)) . ")(?!\w)/iu"替换正则表达式
标签: php regex utf-8 case-insensitive preg-replace-callback