W3docs

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 при ошибке.

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

php— editable, runs on the server

Вывод:

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() или поддерживаемую библиотеку.

Практика

Практика
Какова цель функции metaphone() в PHP?
Какова цель функции metaphone() в PHP?
Was this page helpful?