Мне нужно сравнить имена, которые могут быть написаны несколькими способами. Например, такое имя, как Сент-Томас, иногда написано, например, St-Thomas или Sant Thomas. Предпочтительно, я хочу создать функцию, которая дает процент от «равенства» для сравнения, например, некоторые форумы (это сообщение 5% отредактировано например).PHP Сравните, равны ли строки (почти)
ответ
PHP имеет две (основные) встроенные функции для этого.
levenshtein
, который подсчитывает, сколько изменений (удаление/добавление/замена) необходимо для создания строки2 из строки1. (Чем ниже, тем лучше)
и
similar_text
, который возвращает количество совпадающих символов (выше, тем лучше). Обратите внимание, что вы можете передать ссылку в качестве третьего параметра, и она даст вам процент.
<?php
$originalPost = "Here's my question to stack overflou. Thanks /h2ooooooo";
$editedPost = "Question to stack overflow.";
$matchingCharacters = similar_text($originalPost, $editedPost, $matchingPercentage);
var_dump($matchingCharacters); //int(25)
var_dump($matchingPercentage); //float(60.975609756098) (hence edited 40%)
?>
А функция levenshtein идеальна! Большое спасибо, ответит на ваш ответ через 6 минут :-). – dirk
Если вы хотите что-то более продвинутое, посмотрите [это эссе] (http://web.archive.org/web/20061007123913/http://www.english.upenn.edu/~jlynch/Computing/compare.html) , – gronostaj
@gronostaj: Спасибо ... но для моего приложения это должно быть достаточно хорошим.Производительность, похоже, тоже в порядке :-). – dirk
Заканчивать levenshtein()
, который делает то, что вы хотите, и является сравнительно эффективным (но не очень эффективно): http://www.php.net/manual/en/function.levenshtein.php
Вы можете использовать различные подходы.
Вы можете использовать функцию similar_text()
, чтобы проверить наличие сходства.
ИЛИ
Вы можете использовать levenshtein()
функцию, чтобы узнать ...
Левенштейна расстояние определяется как минимальное количество символов, которые вы должны заменить, вставить или удалить, чтобы трансформировать str1 в str2
И затем проверьте наличие разумного порога для вашей проверки.
Расстояние редактирования между двумя строками символов обычно относится к расстоянию Левенштейна.
$v1 = 'pupil';
$v2 = 'people';
# TRUE if $v1 & $v2 have similar pronunciation
soundex($v1) == soundex($v2);
# Same but it use a more accurate comparison algorithm
metaphone($v1) == metaphone($v2);
# Calculate how many common characters between 2 strings
# Percent store the percentage of common chars
$common = similar_text($v1, $v2, $percent);
# Compute the difference of 2 text
$diff = levenshtein($v1, $v2);
Таким образом, либо levenshtein($v1, $v2)
или similar_text($v1, $v2, $percent)
будет делать это для вас, но все еще есть компромисс. Сложность алгоритма levenshtein()
равна O(m*n)
, где n и m - длина v1 и v2 (довольно хорошо по сравнению с similar_text()
, что составляет O(max(n,m)**3)
, но все еще дорого).
- 1. Сравните, если две строки равны
- 2. Сравните две строки, очевидно, они равны
- 3. Сравните две даты в vb.net, равны ли они или нет
- 4. IOS: Сравните два меньше или равны NSDates
- 5. сравните 2 строки и верните количество букв, которые не равны
- 6. Сравните две строки и, если они равны в обратном направлении
- 7. Проверка, равны ли две строки
- 8. Утверждай две переменные почти равны в Python
- 9. Сравните два веб-сайта и посмотрите, равны ли они?
- 10. Почему эти строки равны?
- 11. Строки отличаются, но равны в php
- 12. Как проверить, равны ли все строки матрицы
- 13. Сравните значение массива PHP с PART строки
- 14. Проверьте и сравните две строки в PHP
- 15. Сравните, если два объекта dataframe в R равны?
- 16. Попадая почти различающиеся строки
- 17. Удалить почти дублированные строки
- 18. Сравните строки, чтобы узнать, идентичны ли они.
- 19. Две строки не равны
- 20. Проверка, равны ли значения true в PHP
- 21. PHP: проверка того, равны ли три переменные
- 22. ANOVA in R: Степени свободы почти все равны 1
- 23. Сравните две длинные строки
- 24. PHP: Сравните начало двух строк
- 25. Строки Python не равны
- 26. Почему строки не равны
- 27. Сравните 2 строки с другой кодировкой
- 28. Разделить вектор такой, что средства двух групп почти равны
- 29. Проверьте, равны ли два разных ArrayLists равны
- 30. Сравните часть 2 строк (PHP)?
Когда вы не ищете процент, другая возможность - регулярное выражение. Но для этого нужно знать, насколько сильно могут быть два имени. –
Я думаю, что это то, что вы хотите: http://stackoverflow.com/questions/2285201/php-smart-error-tolerating-string-comparison – fons
[аналогичный текст] (http://www.php.net/manual /de/function.similar-text.php) – bitWorking