W3docs

soundex()

Статья о функции PHP soundex(), которая вычисляет ключ Soundex строки и полезна для сравнения произношения слов.

Функция PHP soundex() вычисляет ключ Soundex строки — короткий код, представляющий то, как строка звучит на английском языке, а не как она пишется. Два слова, написанных по-разному, но произносимых схожим образом (например, «Smith» и «Smyth»), дают одинаковый ключ, что делает Soundex удобным инструментом для нечёткого поиска имён, подсказок при проверке орфографии и дедупликации списков контактов.

На этой странице рассматриваются синтаксис soundex(), формат возвращаемого ключа, принцип работы алгоритма и практические примеры — включая ограничения функции и её сравнение со связанными функциями.

Синтаксис

soundex(string $string): string

Функция принимает один параметр:

  • $string — входная строка для кодирования. Учитываются только буквенные символы; цифры, пробелы и знаки пунктуации игнорируются.

Функция возвращает ключ Soundex в виде строки. Для непустого буквенного ввода ключ всегда состоит из 4 символов: одной заглавной буквы, за которой следуют три цифры (например, H464). Если входная строка не содержит букв, soundex() возвращает пустую строку.

Как формируется ключ Soundex

Алгоритм Soundex сводит слово к его первой букве плюс трёхзначный код на основе оставшихся согласных звуков:

  1. Сохраняется первая буква слова.

  2. Оставшиеся буквы преобразуются в цифры; согласные, звучащие похоже, группируются:

    БуквыЦифра
    b, f, p, v1
    c, g, j, k, q, s, x, z2
    d, t3
    l4
    m, n5
    r6
  3. Гласные a, e, i, o, u и буквы h, w, y отбрасываются (им не присваивается цифра).

  4. Соседние одинаковые цифры сворачиваются в одну.

  5. Результат дополняется нулями (или усекается) до ровно четырёх символов.

Вот почему soundex('Robert') и soundex('Rupert') оба дают R163 — различающиеся гласные игнорируются.

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

php— editable, runs on the server

Здесь строка $string кодируется с помощью soundex(). Результат:

H464

H — это первая буква, а 464 кодирует согласные звуки l (4), r (6), l (4). Пробел и граница слова игнорируются — Soundex обрабатывает входные данные как единую последовательность букв.

Сравнение двух строк

Наиболее распространённое применение soundex() — проверка того, одинаково ли звучат два слова, путём сравнения их ключей:

php— editable, runs on the server

Поскольку Smith и Smyth оба кодируются в S530, их ключи совпадают и результат:

The strings sound the same.

Поиск имени в списке

Типичный паттерн — предлагать варианты «вы имели в виду…» из известного списка, когда точное совпадение не найдено:

<?php
$names = ['Robert', 'Rupert', 'Rubin', 'Albert'];
$query = 'Ruppert';
$queryKey = soundex($query);

foreach ($names as $name) {
    if (soundex($name) === $queryKey) {
        echo "$name sounds like $query\n";
    }
}
?>

И Robert, и Rupert имеют тот же ключ R163, что и Ruppert, поэтому результат:

Robert sounds like Ruppert
Rupert sounds like Ruppert

Ограничения

  • Ориентация на английский язык. Сопоставление букв с цифрами настроено под английское произношение, поэтому для имён из других языков функция работает плохо.
  • Первая буква должна совпадать. Поскольку Soundex всегда сохраняет первую букву, Kris (K620) и Chris (C620) не совпадут, хотя звучат одинаково.
  • Грубое сопоставление. Учитываются лишь первые несколько согласных звуков, поэтому сильно различающиеся длинные слова могут получить одинаковый ключ. Используйте Soundex как предварительный фильтр, а не как окончательный ответ.

Для другого фонетического алгоритма, который нередко лучше справляется с английским, см. metaphone(). Чтобы измерить насколько похожи две строки, а не просто одинаково ли они звучат, см. similar-text() и levenshtein().

Практика

Практика
Какова функция системы Soundex в PHP?
Какова функция системы Soundex в PHP?
Was this page helpful?