metaphone

(PHP 4, PHP 5, PHP 7, PHP 8)

metaphone计算字符串的 metaphone 键

描述

metaphone(string $string, int $max_phonemes = 0): string

计算 string 的 metaphone 键。

类似于 soundex(),metaphone 为听起来相似的单词创建相同的键。它比 soundex() 更准确,因为它了解英语发音的基本规则。生成的 metaphone 键的长度可变。

Metaphone 由 Lawrence Philips <lphilips at verity dot com> 开发。它在 ["Practical Algorithms for Programmers", Binstock & Rex, Addison Wesley, 1995] 中有描述。

参数

string

输入字符串。

max_phonemes

此参数将返回的 metaphone 键限制为 max_phonemes字符长度。但是,生成的音素始终被完全转录,因此结果字符串长度可能比 max_phonemes 略长。默认值为 0,表示没有限制。

返回值

返回 metaphone 键作为字符串。

变更日志

版本 描述
8.0.0 该函数在失败时返回 false

示例

示例 #1 metaphone() 基本示例

<?php
var_dump
(metaphone('programming'));
var_dump(metaphone('programmer'));
?>

上面的示例将输出

string(7) "PRKRMNK"
string(6) "PRKRMR"

示例 #2 使用 max_phonemes 参数

<?php
var_dump
(metaphone('programming', 5));
var_dump(metaphone('programmer', 5));
?>

上面的示例将输出

string(5) "PRKRM"
string(5) "PRKRM"

示例 #3 使用 max_phonemes 参数

在这个示例中,metaphone() 被建议生成一个五字符的字符串,但这将需要拆分最后一个音素('x' 应该被转录为 'KS'),因此函数返回一个六字符的字符串。

<?php
var_dump
(metaphone('Asterix', 5));
?>

上面的示例将输出

string(6) "ASTRKS"

添加注释

用户贡献的注释 6 notes

mail at spam-off dot iaindooley dot com
20 年前
您可以通过获取两个 metaphone 代码之间的 Levenshtein 距离,然后将此距离作为原始 metaphone 代码长度的百分比来非常有效地使用 metaphone 函数来处理短语。因此,您可以定义一个百分比错误(例如 20%),并且只接受比该错误更接近的匹配。我发现这在我的网站上使用的函数中非常有效,其中用户输入的专辑名称会根据可能类似的现有专辑名称进行验证。这对于人们能够模糊地记住短语并从数据库中获得多个建议也是一个很好的方法。因此,您可以输入“i stiched nine times”,错误百分比为 50%,仍然可以获得“a stitch in time saves nine”作为匹配。
php at casadebender dot com
16 年前
有一个可用的双 metaphone pecl 模块:http://pecl.php.net/package/doublemetaphone
Vipindas K.S
16 年前
metaphone
=======================
metaphone() 函数可用于拼写应用程序。此函数在成功时返回字符串的 metaphone 键,在失败时返回 FALSE。它的主要用途是在您搜索家谱数据库时。检查是否提供 metaphone 搜索。它在制作/搜索家谱时也很有用。
下面是一个计算和比较两个字符串以查找其 metaphone 代码是否相等的简单代码。

html 代码
==========
<html>
<body>
<form action="test.php" name="test" method="get">
名称 1:<input type="text" name="name1" /><br />
名称 2:<input type="text" name="name2" /><br />
<input type="submit" name="submit" value="比较" />
</form>

<!--php 代码从此处开始 -->

<?php
if(isset($_GET['submit']))
{
$str1 = $_GET['name1'];
$str2 = $_GET['name2'];
$meta_one=metaphone($str1);
$meta_two=metaphone($str2);
echo
"metaphone 代码为 ".$str1." 是 ". $meta_one;
echo
"<br />";
echo
"metaphone 代码为 ".$str2." 是 ". $meta_two."<br>";
if(
$meta_one==$meta_two)
{
echo
"metaphone 代码匹配";
}
else
{
echo
"metaphone 代码不匹配";
}
}
?>

</body>
</html>

Metaphone 算法由 Lawrence Philips 开发。

Lawrence Philips 的规则如下

16 个辅音
|--- ZERO 代表“th”
|
B X S K J T F H L M N P R 0 W Y

异常

单词开头: "ae-", "gn", "kn-", "pn-", "wr-" ----> 删除第一个字母
"Aebersold", "Gnagy", "Knuth", "Pniewski", "Wright"

单词开头: "x" ----> 更改为 "s"
例如 "Deng Xiaopeng"

单词开头: "wh-" ----> 更改为 "w"
例如 "Whalen"

转换

B ----> B 除非在 "m" 之后,单词结尾,例如 "dumb", "McComb"

C ----> X (sh) 如果 "-cia-" 或 "-ch-"
S 如果 "-ci-", "-ce-", 或 "-cy-"
静音如果 "-sci-", "-sce-", 或 "-scy-"
否则为 K,包括 "-sch-"

D ----> J 如果在 "-dge-", "-dgy-", 或 "-dgi-" 中
否则为 T

F ----> F

G ----> 静音如果在 "-gh-" 中并且不在结尾或元音之前
在 "-gn" 或 "-gned" 中
在 "-dge-" 等中,如上述规则
J 如果在 "i" 之前,或 "e" 之前,或 "y" 之前,如果 "gg" 不重复
否则为 K

H ----> 静音如果在元音之后,并且没有元音跟随
或在 "-ch-", "-sh-", "-ph-", "-th-", "-gh-" 之后
否则为 H

J ----> J

K ----> 静音如果在 "c" 之后
否则为 K

L ----> L

M ----> M

N ----> N

P ----> F 如果在 "h" 之前
否则为 P

Q ----> K

R ----> R

S ----> X (sh) 如果在 "h" 之前或在 "-sio-" 或 "-sia-" 中
否则为 S

T ----> X (sh) 如果 "-tia-" 或 "-tio-"
0 (th) 如果在 "h" 之前
静音如果在 "-tch-" 中
否则为 T

V ----> F

W ----> 静音如果后面没有元音
W 如果后面是元音

X ----> KS

Y ----> 静音如果后面没有元音
如果后面跟着元音,则为 Y

Z ----> S
Ray.Paseur 经常使用 Gmail
11 年前
Metaphone() 显然忽略了非英语字符。比较 Plaçe TO Place 会产生 "PL" 和 "PLS"。Soundex() 也产生了类似的结果。
isloera at usedformyjunk dot com
9 年前
我更改了我的域名,因此西班牙语 methaphone 的代码在这里

http://www.ojocaliente.net/spanish_metaphone.php

请更新链接 ;-)
isloera at usedformyjunk dot com
9 年前
我更改了我的域名,因此西班牙语 methaphone 的代码在这里

http://www.ojocaliente.net/spanish_metaphone.php

请更新链接 ;-)
To Top