如何使函数适用于双字?

时间:2017-10-27 15:29:50

标签: php regex utf-8 case-insensitive preg-replace-callback

我的功能现在只能用一个单词。例如,我在关联数组中有单词。我的函数用文本中的值替换数组键。并且保持单词小写的功能,但是当你替换单词时,它将返回写在文本上的输入单词寄存器。现在,该函数不能与成对的单词一起使用,以用其他单词对替换单词对。

实施例

// 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 УзБеК ТоЧИК";

1 个答案:

答案 0 :(得分:0)

首先:将你的案例转换推出问题并编写一个专门的函数来处理它。

关于单词对:您可以使用以下方法解决问题:

  • 带有可选子模式的前瞻以捕获第二个单词
  • 一个静态布尔变量(在回调函数中定义),以了解前一个匹配项是否是现有两个单词子串的第一个单词。

你只需要这种模式:

~\b\pL+\b(?=( \pL+\b)?)~u

前瞻允许在单词的每个开头处遍历字符串(即使在字符串的末尾,因为(?=( \pL+\b)?)始终为真的断言。)因为它没有&#t;消耗任何角色。

非常简单:

  • 布尔变量在开头设置为false
  • 当布尔值为false且dict键中存在小写的$m[0].$m[1] 时,则将布尔值设置为true并返回dict值,否则返回{{1 }}
  • 当布尔值为true时,将其设置为$m[0]并返回空字符串

优点:你不必关心字典大小。使用相同的想法,你甚至可以将算法扩展到更多的单词,几乎没有变化,或者处理一个项目键具有不同数量的单词的字典。

建议:当你想改变回溯限制或建立一个巨大的变化时,不要这样做。这只意味着你的方法不是好方法。