2024年PHP开发者大会(日本)

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>开发的。它在[“程序员实用算法”,Binstock & Rex,Addison Wesley,1995]中进行了描述。

参数

string

输入字符串。

max_phonemes

此参数将返回的Metaphone键限制为max_phonemes字符的长度。但是,生成的音素总是被完整地转录,因此结果字符串的长度可能略长于max_phonemes0的默认值表示没有限制。

返回值

返回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"

添加注释

用户贡献的注释 4条注释

mail at spam-off dot iaindooley dot com
20年前
您可以通过获取两个Metaphone代码之间的Levenshtein距离,然后将其作为原始Metaphone代码长度的百分比来非常有效地使用metaphone函数与短语。因此,您可以定义一个百分比误差(例如20%),并且只接受比该误差更接近的匹配。我发现这在我的网站上使用的函数中非常有效,其中用户输入的专辑名称与可能相似的现有专辑名称进行验证。这对于人们能够模糊地记住一个短语并从数据库中获得多个建议也是一种极好的方法。因此,您可以输入“我缝了九次”,误差百分比为50%,仍然可以得到“及时一针省九针”作为匹配。
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”
例如“邓小平”

单词开头为“wh-”----> 改为“w”
例如“Whalen”

转换规则

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

C ----> X (sh) 如果包含“-cia-” 或 “-ch-”
S 如果包含“-ci-”,“-ce-” 或 “-cy-”
SILENT (静音) 如果包含“-sci-”,“-sce-” 或 “-scy-”
K 其他情况,包括“-sch-”

D ----> J 如果包含“-dge-”,“-dgy-” 或 “-dgi-”
T 其他情况

F ----> F

G ----> SILENT (静音) 如果包含“-gh-” 且不在单词结尾或元音之前
在“-gn”或“-gned”中
在“-dge-”等中,如同上规则
J 如果在“i”,“e”或“y”之前,且不是双“gg”
K 其他情况

H ----> SILENT (静音) 如果在元音之后且没有元音跟随
或者在“-ch-”,“-sh-”,“-ph-”,“-th-”,“-gh-”之后
其他情况为H

J ----> J

K ----> SILENT (静音) 如果在“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”之前
SILENT (静音) 如果包含“-tch-”
T 其他情况

V ----> F

W ----> SILENT (静音) 如果后面没有元音
W 如果后面有元音

X ----> KS

Y ----> SILENT (静音) 如果后面没有元音
Y 如果后面有元音

Z ----> S
php at casadebender dot com
16年前
有一个可用的双元音音位 (Double Metaphone) pecl 模块:http://pecl.php.net/package/doublemetaphone
Ray.Paseur 经常使用 Gmail
11年前
Metaphone() 显然忽略了非英语字符。比较 Plaçe TO Place 得到的结果是“PL”和“PLS”。Soundex()也有类似的结果。
To Top