この関数は文字数制約のある雑な実装になっています。制約のない実装は@mpywさんの
[マルチバイト対応] レーベンシュタイン距離を求めるをご覧ください。
levenshtein()のマルチバイト対応版
<?php
function mb_levenshtein($string1, $string2)
{
$tokens1 = preg_split('/(?<!^)(?!$)/u', $string1);
$tokens2 = preg_split('/(?<!^)(?!$)/u', $string2);
$tokens = array_unique(array_merge($tokens1, $tokens2));
if ( count($tokens) > 26 )
{
return false;
}
$ascii = 'a';
foreach ( $tokens as $token )
{
$string1 = str_replace($token, $ascii, $string1);
$string2 = str_replace($token, $ascii, $string2);
$ascii ++;
}
$arguments = func_get_args();
$arguments[0] = $string1;
$arguments[1] = $string2;
return call_user_func_array('levenshtein', $arguments);
}
var_dump(mb_levenshtein('あとうかい', 'かとうあい')); // int(2)
- 制限事項:比較する文字の種類(文字数ではない)は26を超えると false を返します。
- http://php.net/manual/ja/function.levenshtein.php