similar_text()
Статья о функции PHP similar_text(), которая вычисляет степень сходства двух строк и возвращает количество совпадающих символов.
Функция PHP similar_text() измеряет степень схожести двух строк. Вместо простого сравнения «да/нет» она подсчитывает количество совпадающих символов и может выражать это совпадение в процентах. Это делает её полезной для нечёткого сопоставления: обнаружения почти дублирующихся записей, предложений исправлений вида «вы имели в виду…?» или ранжирования результатов поиска по степени близости.
В этой главе рассматриваются синтаксис, возвращаемое значение, необязательный аргумент для процентного показателя, особенности поведения функции и практический пример, который можно запустить.
Синтаксис
similar_text(string $string1, string $string2, float &$percent = null): intФункция принимает три параметра:
$string1и$string2— две сравниваемые строки.$percent— необязательный. Если передать сюда переменную, она будет передана по ссылке и получит значение процентного сходства (floatот0до100).
Возвращаемое значение — целое число: количество совпадающих символов между двумя строками, найденных с помощью алгоритма наибольшей общей подстроки, применяемого рекурсивно.
Как вычисляется процент
Процент вычисляется по формуле: (matches * 2) / (length1 + length2) * 100. Значение 100 означает, что строки идентичны, а 0 — что у них нет ничего общего. Поскольку формула использует длины обеих строк, процент одинаков вне зависимости от порядка передачи строк.
Базовый пример
Мы инициализируем $percent значением 0, чтобы PHP не выводил предупреждение о «неопределённой переменной», а затем передаём её по ссылке. Вывод:
6
60Две строки имеют 6 совпадающих символов (Hello — слово «Hello» и пробел), что соответствует 60% сходства.
На что обратить внимание
Функция чувствительна к регистру. Строки 'Hello' и 'hello' не считаются одинаковыми — первые символы различаются. Если регистр следует игнорировать, нормализуйте строки с помощью strtolower():
<?php
$a = strtolower('Hello');
$b = strtolower('hello');
similar_text($a, $b, $percent);
echo $percent; // 100
?>Переменная для процента должна существовать заранее. Поскольку $percent передаётся по ссылке, объявите её перед вызовом (например, $percent = 0;), чтобы избежать предупреждений.
Порядок аргументов не влияет на процент, но производительность имеет значение. similar_text() дороже простого сравнения из-за рекурсивного алгоритма. Для очень длинных строк или больших наборов данных перед использованием в критических участках кода проведите профилирование.
similar_text() vs. levenshtein()
Обе функции измеряют сходство строк, но отвечают на разные вопросы:
similar_text()подсчитывает совпадающие символы и возвращает показатель сходства — чем выше, тем больше сходство.levenshtein()подсчитывает правки (вставки, удаления, замены), необходимые для преобразования одной строки в другую — чем меньше, тем больше сходство.
Используйте similar_text(), когда нужен процент близости; используйте levenshtein(), когда важно, сколько нажатий клавиш разделяют две строки, например при проверке правописания.
Заключение
Функция similar_text() — практичный инструмент для нечёткого сравнения строк. Она возвращает целое число совпадающих символов, принимает необязательную переменную по ссылке для получения процентного показателя и чувствительна к регистру. Для смежных инструментов сравнения см. strcmp() для точного сравнения, levenshtein() для редакционного расстояния и soundex() для фонетического сопоставления.