]> granicus.if.org Git - php/commitdiff
Remove string length limit from levenshtein()
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 6 Oct 2020 15:12:41 +0000 (17:12 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 9 Oct 2020 14:12:08 +0000 (16:12 +0200)
As noted on https://bugs.php.net/bug.php?id=80073, I don't think
having this limitation makes sense. The similar_text() function
has much worse asymptotic complexity than levenshtein() and does
not enforce such a limitation. levenshtein() does have fairly high
memory requirements, but they are a fixed factor of the string
length (and subject to memory limit).

ext/standard/levenshtein.c
ext/standard/tests/strings/levenshtein_error_conditions.phpt

index 181674f4d287573e436d804ae55cccfa11cb3878..452b2010bc93b7b591415b203d9ba13880193905 100644 (file)
@@ -17,8 +17,6 @@
 #include "php.h"
 #include "php_string.h"
 
-#define LEVENSHTEIN_MAX_LENGTH 255
-
 /* {{{ reference_levdist
  * reference implementation, only optimized for memory usage, not speed */
 static zend_long reference_levdist(const zend_string *string1, const zend_string *string2, zend_long cost_ins, zend_long cost_rep, zend_long cost_del )
@@ -75,24 +73,12 @@ PHP_FUNCTION(levenshtein)
        zend_long cost_ins = 1;
        zend_long cost_rep = 1;
        zend_long cost_del = 1;
-       zend_long distance = 0;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS|lll", &string1, &string2, &cost_ins, &cost_rep, &cost_del) == FAILURE) {
                RETURN_THROWS();
        }
 
-       if (ZSTR_LEN(string1) > LEVENSHTEIN_MAX_LENGTH) {
-               zend_argument_value_error(1, "must be less than %d characters", LEVENSHTEIN_MAX_LENGTH + 1);
-               RETURN_THROWS();
-       }
-
-       if (ZSTR_LEN(string2) > LEVENSHTEIN_MAX_LENGTH) {
-               zend_argument_value_error(2, "must be less than %d characters", LEVENSHTEIN_MAX_LENGTH + 1);
-               RETURN_THROWS();
-       }
-
-       distance = reference_levdist(string1, string2, cost_ins, cost_rep, cost_del);
 
-       RETURN_LONG(distance);
+       RETURN_LONG(reference_levdist(string1, string2, cost_ins, cost_rep, cost_del));
 }
 /* }}} */
index 71af71297f653a46345b85016b46fa984ba5a35c..55e144b3b25b37e7eb22ee7847e5eaae304b59be 100644 (file)
@@ -1,8 +1,10 @@
 --TEST--
-levenshtein() error conditions
+levenshtein() former error conditions
 --FILE--
 <?php
 
+// levenshtein no longer has a maximum string length limit.
+
 echo '--- String 1 ---' . \PHP_EOL;
 var_dump(levenshtein('AbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrtsuvwxyzAbcdefghijklmnopqrtsuvwxyzAbcdefghijklmnopqrtsuvwxyzAbcdefghijklmnopqrtsuvwxyzAbcdefghijklmnopqrtsuvwxyzAbcdefghijklmnopqrtsu', 'A'));
 try {
@@ -25,7 +27,7 @@ try {
 --EXPECT--
 --- String 1 ---
 int(254)
-levenshtein(): Argument #1 ($string1) must be less than 256 characters
+int(255)
 --- String 2 ---
 int(254)
-levenshtein(): Argument #2 ($string2) must be less than 256 characters
+int(255)