Если вы знаете, какими могут быть правильные URL-адреса, вы можете использовать:
levenshtein($givenURL, $possibleURL)
Пример из PHP документации, комментарии для краткости удалены:
$input = 'carrrot';
$words = array('apple','pineapple','banana','orange',
'radish','carrot','pea','bean','potato');
$shortest = -1;
foreach ($words as $word) {
$lev = levenshtein($input, $word);
if ($lev == 0) {
$closest = $word;
$shortest = 0;
break;
}
if ($lev <= $shortest || $shortest < 0) {
$closest = $word;
$shortest = $lev;
}
}
echo $shortest == 0 ? "Exact match found: $closest\n" : "Did you mean: $closest?\n";
Выходы:
Вводимое слово: морковь
Вы имели в виду морковь?
Это хорошо, когда вы думаете, что люди, возможно, пропустили букву или вставили дополнительную, но это может потерпеть неудачу, когда люди искренне не знают, как написать слово и придумали что-то творческое!
Если вы предпочитаете маршрут soundex()
, взгляните на функцию metaphone()
.
Мне нравится идея использования metaphone()
вместе с levenshtein()
или similar_text()
, поскольку оно возвращает фонетическое представление слова, и вы все еще хотите увидеть, насколько оно похоже на ваш оригинал .
Примеры:
metaphone('name') = NM
metaphone('naaaaaameeeeeeee') = NM
metaphone('naiym') = NM
metaphone('naiyem') = NYM
Несмотря на то, что многие орфографические ошибки возвращают одинаковое совпадение, последний пример показывает, что вы действительно хотите найти самое близкое совпадение с чем-то вроде levenshtein()
Для эффективности, если вы используете другой файл 404, в котором перезаписи пытались соответствовать этому шаблону и потерпели неудачу, чем вы используете для остальной части сайта, это действительно не должно быть огромными накладными расходами.
Если вы получаете одни и те же 404 от одного и того же реферера (и не можете заставить их изменить ссылку), возможно, в этом случае стоит включить статическую перезапись.