metaphone()
Статья о функции PHP metaphone(), которая вычисляет метафон-ключ строки для фонетического поиска и нечёткого сопоставления слов.
Функция PHP metaphone() вычисляет метафон-ключ строки — код, который отражает то, как строка звучит по-английски, а не то, как она пишется. Слова, произносимые одинаково, сопоставляются с одним (или очень похожим) ключом, что делает metaphone() полезной для нечёткого поиска: «Catherine» и «Katherine», «Smith» и «Smyth» сворачиваются в один ключ.
Устарело начиная с PHP 8.4.0.
metaphone()по-прежнему работает в текущем PHP, но находится на пути к удалению. В новом коде предпочтительнее использовать поддерживаемую фонетическую библиотеку (илиsoundex()— более простую встроенную альтернативу). Функция документирована здесь, поскольку многие существующие кодовые базы всё ещё от неё зависят.
В этой статье рассматриваются синтаксис, необязательный аргумент $phonemes, несколько практических примеров и области применения метафон-ключей.
Синтаксис
metaphone(string $string, int $phonemes = 0): string|false| Параметр | Описание |
|---|---|
$string | Входная строка для кодирования. |
$phonemes | Необязательный. Максимальное число символов (фонем) в возвращаемом ключе. При значении 0 (по умолчанию) возвращается полный ключ. |
Возвращаемое значение — метафон-ключ в виде строки в верхнем регистре, или false при ошибке.
Базовый пример
Вывод:
HLWRLTОбратите внимание: нелитерные символы, такие как ! и пробел, игнорируются, а результат представляет собой исключительно коды звуков согласных и гласных. Ключ не предназначен для восприятия человеком — это нормализованный отпечаток произношения.
Как ключ кодирует звуки
Metaphone применяет правила английского произношения, поэтому результат не является транслитерацией один к одному. Стоит знать несколько соглашений:
- Цифра
0(ноль) обозначает звук «th». - Немые и дублирующиеся буквы отбрасываются, некоторые буквосочетания сворачиваются (например,
phстановитсяF).
<?php
echo metaphone("Thompson"), "\n"; // 0MPSN — "Th" → 0, silent p kept by the rule
echo metaphone("Smith"), "\n"; // SM0 — trailing "th" → 0
echo metaphone("PHP"), "\n"; // FP — "ph" → F
?>Вывод:
0MPSN
SM0
FPОграничение длины ключа с помощью $phonemes
Второй аргумент ограничивает максимальное число символов в ключе. Это удобно, когда нужно сравнивать лишь первые несколько звуков длинных слов.
<?php
echo metaphone("Thompson"), "\n"; // full key
echo metaphone("Thompson", 4), "\n"; // first 4 phonemes only
echo metaphone("Wikipedia", 4), "\n";
?>Вывод:
0MPSN
0MPS
WKPTСопоставление слов, звучащих одинаково
Главная ценность metaphone — группировка разных написаний одного и того же звука. Сравним два написания одной фамилии:
<?php
$a = metaphone("Catherine");
$b = metaphone("Katherine");
echo $a, "\n"; // K0RN
echo $b, "\n"; // K0RN
echo $a === $b ? "Match\n" : "No\n"; // Match
?>Вывод:
K0RN
K0RN
MatchПоскольку оба имени имеют одинаковый метафон-ключ, поисковый индекс, построенный на metaphone(), вернёт одно при вводе другого — это основа функций «вы имели в виду…?», дедупликации списков контактов и толерантного поиска по имени.
Когда использовать (и чем заменить)
| Сценарий использования | Примечания |
|---|---|
| Нечёткий поиск имён / слов | Индексируйте метафон-ключ вместе с исходным значением и выполняйте поиск по ключу. |
| Поиск с допуском опечаток | Улавливает фонетические опечатки, которые точное сопоставление пропускает. |
| Дедупликация записей | Группируйте строки, имена которых звучат одинаково. |
metaphone() моделирует произношение только английского языка, поэтому для других языков она ненадёжна. Для измерения расстояния по опечаткам, а не по звуку, используйте levenshtein() или similar_text(). Для более простого, не устаревшего фонетического кода встроенной альтернативой является soundex().
Итог
metaphone() преобразует слово в фонетический ключ, благодаря чему по-разному написанные, но похоже звучащие слова совпадают. Помните, что ключ кодирует английское произношение (где 0 обозначает «th»), что необязательный аргумент $phonemes ограничивает длину ключа, и что функция объявлена устаревшей начиная с PHP 8.4 — в новых проектах предпочтительнее использовать soundex() или поддерживаемую библиотеку.