У меня есть скрипт, который я нашел здесь, который хорошо работает при поиске самой низкой общей подстроки.
Однако мне нужно, чтобы он допускал некоторые неправильные/отсутствующие символы. Я хотел бы иметь возможность либо ввести требуемый процент сходства, либо, возможно, указать допустимое количество отсутствующих/неправильных символов.
Например, я хочу найти эту строку:
большой желтый школьный автобус
внутри этой строки:
в тот день они ехали на большом желтом школьном автобусе
Это код, который я сейчас использую:
function longest_common_substring($words) {
$words = array_map('strtolower', array_map('trim', $words));
$sort_by_strlen = create_function('$a, $b', 'if (strlen($a) == strlen($b)) { return strcmp($a, $b); } return (strlen($a) < strlen($b)) ? -1 : 1;');
usort($words, $sort_by_strlen);
// We have to assume that each string has something in common with the first
// string (post sort), we just need to figure out what the longest common
// string is. If any string DOES NOT have something in common with the first
// string, return false.
$longest_common_substring = array();
$shortest_string = str_split(array_shift($words));
while (sizeof($shortest_string)) {
array_unshift($longest_common_substring, '');
foreach ($shortest_string as $ci => $char) {
foreach ($words as $wi => $word) {
if (!strstr($word, $longest_common_substring[0] . $char)) {
// No match
break 2;
}
}
// we found the current char in each word, so add it to the first longest_common_substring element,
// then start checking again using the next char as well
$longest_common_substring[0].= $char;
}
// We've finished looping through the entire shortest_string.
// Remove the first char and start all over. Do this until there are no more
// chars to search on.
array_shift($shortest_string);
}
// If we made it here then we've run through everything
usort($longest_common_substring, $sort_by_strlen);
return array_pop($longest_common_substring);
}
Буду признателен за любую оказанную помощь.
ОБНОВЛЕНИЕ
Функция PHP levenshtein ограничена 255 символами, а некоторые из стогов сена, которые я ищу, содержат более 1000 символов.