PHP には2つの文字がどれだけ似ているかを表す関数が2つ用意されています。
ひとつは similar_text() で、もうひとつは levenshtein() です。
similar_text() は類似度をパーセントで返し、
levenshtein() は、両者を一致させるのにかかる作業量を返します。
後者のレーベンシュタイン距離を調べるアルゴリズムは Wikipedia に掲載されているので、
それを参考にマルチバイト対応版 mb_levenshtein を作ってみました。
<?php function mb_levenshtein($str1, $str2, $encoding){ $length1 = mb_strlen($str1, $encoding); $length2 = mb_strlen($str2, $encoding); $str1 = mb_str_split($str1, $encoding); $str2 = mb_str_split($str2, $encoding); $distance = array(); for($i=0;$i<=$length1;$i++){ $distance[$i] = array(); $distance[$i][0] = $i; } for($i=0;$i<=$length2;$i++){ $distance[0][$i] = $i; } $cost = 0; for($i=1;$i<=$length1;$i++){ for($j=1;$j<=$length2;$j++){ $cost = ($str1[$i - 1] === $str2[$j-1]) ? 0 : 1; $distance[$i][$j] = min( $distance[$i - 1][$j] + 1, $distance[$i][$j - 1] + 1, $distance[$i - 1][$j - 1] + $cost ); } } return $distance[$length1][$length2]; } function mb_str_split($str, $encoding){ $arr = array(); $length = mb_strlen($str, $encoding); for($i=0;$i<$length;$i++){ $arr[] = mb_substr($str, $i, 1, $encoding); } return $arr; } $str1 = "sample"; $str2 = "example"; header("Content-type:text/html; charset=utf-8"); echo mb_levenshtein($str1, $str2, 'utf-8');
Similar Posts:
- [PHP]料金表のようなものをテキストだけで表現する
- [PHP]「もしかして: ~」スペルミス時の修正候補を表示する
- [PHP]マルチパートメールの構造
- [PHP]背景の明るさを基準に見やすい文字色を組み合わせる(YUV輝度)
- [PHP]携帯サイト向けに文字コードを一括変換する
- [PHP]似た画像を検索して近い順番に並べる(類似画像検索)
- [PHP]Luhnアルゴリズムによる番号のチェック
- [PHP]DOM, XPathを使ったスクレイピング(HTMLのタグ内容取得)