1

Soundex: примеры (PHP)

Функция soundex в PHP: примеры и применение
Раздел: Работа со строками
soundex(string string): string

Функция soundex() возвращает ключ soundex для переданной строки. Этот алгоритм позволяет сравнивать слова по их звучанию на английском языке, что полезно для поиска с учётом возможных орфографических ошибок или вариантов произношения.

Назначение и аргументы

Функция используется в задачах нечёткого поиска, особенно при работе с именами и фамилиями на английском языке. Она принимает один обязательный аргумент:

  • $string (string) - строка, для которой вычисляется ключ soundex.

Функция возвращает строку из четырёх символов, начинающуюся с буквы. Похожие по звучанию слова имеют одинаковый ключ.

Базовые примеры

Простое вычисление ключа для одного слова:

echo soundex('Robert');
R163

Сравнение двух разных написаний имени:

echo soundex('Rupert') . '\n';
echo soundex('Robert');
R163
R163

Обработка строки с пробелами и разным регистром:

echo soundex('  HELLO  ');
H400
Похожие функции в PHP

Для задач фонетического сравнения в PHP доступны несколько функций:

  • metaphone() - более точный алгоритм, учитывающий вариации английского произношения. Рекомендуется для современных проектов вместо soundex.
  • levenshtein() - вычисляет расстояние Левенштейна между строками, полезно для исправления опечаток.
  • similar_text() - определяет процент схожести двух строк.

Функцию metaphone часто предпочитают, так как она генерирует более точные ключи для большего количества слов.

Типичные ошибки

Ожидание работы с неанглийскими словами:

echo soundex('Шевченко');
S250

Результат некорректен, так как алгоритм заточен под английскую фонетику.

Передача нестроковых аргументов:

echo soundex(123);
0000

Функция преобразует число в строку, что даёт неожиданный ключ.

Изменения в версиях PHP

В PHP 8.0 функция стала более строгой к типам аргументов. До PHP 8 функция молчаливо преобразовывала нестроковые значения. Сейчас такое поведение сохранилось, но рекомендуется передавать именно строки для предсказуемости результата.

Расширенные примеры

Поиск в массиве по фонетическому ключу:

Пример php
$names = ['Robert', 'Rupert', 'Robart', 'John'];
$target = 'Robert';
$targetKey = soundex($target);

foreach ($names as $name) {
if (soundex($name) === $targetKey) {
echo "Найдено совпадение: $name\n";
}
}
Найдено совпадение: Robert
Найдено совпадение: Rupert
Найдено совпадение: Robart

Очистка входных данных перед вычислением:

Пример php
$input = 'Dr. Robert".!';
$clean = preg_replace('/[^A-Za-z]/', '', $input);
echo soundex($clean);
R163

Сравнение с metaphone для улучшения точности:

Пример php
$word1 = 'Katherine';
$word2 = 'Catherine';

echo "soundex: " . (soundex($word1) === soundex($word2) ? 'совпадает' : 'разное') . "\n";
echo "metaphone: " . (metaphone($word1) === metaphone($word2) ? 'совпадает' : 'разное');
soundex: разное
metaphone: совпадает

Это показывает, что metaphone лучше справляется с разными вариантами написания.

Аналоги в других языках

Soundex в Python

Модуль soundex или функция в библиотеках типа jellyfish:

import jellyfish
print(jellyfish.soundex('Robert'))
R163

Soundex в Javascript

Реализация требует внешней библиотеки или собственной функции, так как в стандартной библиотеке нет soundex.

Soundex в MySQL

Встроенная функция SOUNDEX():

SELECT SOUNDEX('Robert');
R163

В отличие от PHP, MySQL автоматически обрезает строку и обрабатывает только первую часть составных имён.

PHP soundex function comments

En
Soundex Calculate the soundex key of a string