为什么PHP中的levenshtein函数具有255个字符的限制?

时间:2018-09-06 09:38:33

标签: php function levenshtein-distance

有人知道为什么PHP中的功能 levenshtein 具有255个字符的限制吗?

2 个答案:

答案 0 :(得分:2)

这是该功能的PHP完整实现。如您所见,存在基于字符串字符长度的嵌套循环:

function lev($s,$t) {
  $m = strlen($s);
  $n = strlen($t);

  for($i=0;$i<=$m;$i++) $d[$i][0] = $i;
  for($j=0;$j<=$n;$j++) $d[0][$j] = $j;

  for($i=1;$i<=$m;$i++) {
    for($j=1;$j<=$n;$j++) {
      $c = ($s[$i-1] == $t[$j-1])?0:1;
      $d[$i][$j] = min($d[$i-1][$j]+1,$d[$i][$j-1]+1,$d[$i-1][$j-1]+$c);
    }
  }

  return $d[$m][$n];
}

https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#PHP

PHP中名为levenshtein()的PHP版本从版本4.0.1开始到255个字符长度。

我认为引入限制是为了将性能和持续时间保持在最可接受的范围内。

如果您需要长度大于255的字符串比较,则可以使用上面的实现。

答案 1 :(得分:-3)

PHP的levenshtein()函数最多只能处理255个字符,这对于用户输入来说是不现实的(仅这篇文章的第一段有285个字符)。如果您选择使用能够处理超过255个字符的自定义函数,则效率是一个重要问题。

我使用此功能,专用于此情况,但速度更快:

function ucase_percent ($str) {
    $str2 = strtolower ($str);

    $l = strlen ($str);
    $ucase = 0;

    for ($i = 0; $i < $l; $i++) {
        if ($str{$i} != $str2{$i}) {
            $ucase++;
        }
    }

    return $ucase / $l * 100.0;
}