PHP 複数形を単数形に変換 - サンプルコード

2013/11/07

複数形、単数形

英語では同じ単語でも複数形と単数形で異なります。
例えば、computerの複数形はcomputersとなります。

日本では複数でも同じ読み方をしますよね。
実は同じ読み方をする方が珍しいのです。

複数形と単数系の変換は、ルールがありますがイレギュラーな単語もあります。
s、esをつけるものもあれば、「man」と「men」のように特質な変化をするものもあるのです。
より詳しく知りたい方は、英語を勉強してください。

PHPでこれらの変換を行いたくライブラリを探したのですが、なかなかしっくりするものが見つかりませんでした。
そのため、自分で作成したのでコードを掲載します。

サンプルコード

SingularByPlural.php というファイル名を作成して下記コードを記述。


$irregular_rules = array(
	'men'		=>	'man',
	'seamen'	=>	'seaman',
	'snowmen'	=>	'snowman',
	'women'		=>	'woman',
	'people'	=>	'person',
	'children'	=>	'child',
	'sexes'		=>	'sex',
	'moves'		=>	'move',
	'databases'	=>	'database',
	'feet'		=>	'foot',
	'cruces'	=>	'crux',
	'oases'		=>	'oasis',
	'phenomena'	=>	'phenomenon',
	'teeth'		=>	'tooth',
	'geese'		=>	'goose',
	'atlases'	=>	'atlas',
	'corpuses'	=>	'corpus',
	'genies'	=>	'genie',
	'genera'	=>	'genus',
	'graffiti'	=>	'graffito',
	'loaves'	=>	'loaf',
	'mythoi'	=>	'mythos',
	'niches'	=>	'niche',
	'numina'	=>	'numen',
	'octopuses'	=>	'octopus',
	'opuses'	=>	'opus',
	'penises'	=>	'penis',
	'equipment'	=>	'equipment',
	'information'	=>	'information',
	'rice'		=>	'rice',
	'money'		=>	'money',
	'species'	=>	'species',
	'series'	=>	'series',
	'fish'		=>	'fish',
	'sheep'		=>	'sheep',
	'swiss'		=>	'swiss',
);

$singular_rules = array(
	'(quiz)zes$'		=>	'$1',
	'(matr)ices$'		=>	'$1ix',
	'(vert|ind)ices$'	=>	'$1ex',
	'^(ox)en'		=>	'$1',
	'(alias|status)es$'	=>	'$1',
	'(octop|vir)i$'		=>	'$1us',
	'(cris|ax|test)es$'	=>	'$1is',
	'(shoe)s$'		=>	'$1',
	'(o)es$'		=>	'$1',
	'(bus)es$'		=>	'$1',
	'([m|l])ice$'		=>	'$1ouse',
	'(x|ch|ss|sh)es$'	=>	'$1',
	'movies$'		=>	'movie',
	'series$'		=>	'series',
	'([^aeiouy]|qu)ies$'	=>	'$1y',
	'([lr])ves$'		=>	'$1f',
	'(tive)s$'		=>	'$1',
	'(hive)s$'		=>	'$1',
	'([^f])ves$'		=>	'$1fe',
	'(^analy)ses$'		=>	'$1sis',
	'(analy|ba|diagno|parenthe|progno|synop|the)ses$'	=>	'$1sis',
	'([ti])a$'		=>	'$1um',
	'(n)ews$'		=>	'$1ews',
	'(.)s$'			=>	'$1',
);

function singularByPlural($plural) {
	global $irregular_rules;
	global $singular_rules;

	$singular = $plural;

	if (array_key_exists(strtolower($plural), $irregular_rules)) {
		$singular = $irregular_rules[strtolower($plural)];
	} else {
		foreach($singular_rules as $key => $value) {
			if (preg_match('/' . $key . '/', $plural)) {
				$singular = preg_replace('/' . $key . '/', $value, $plural);
				break;
			}
		}
	}

	return $singular;
}

このように使用します。


require_once "SingularByPlural.php";

$value = 'computers';
$singular_value = singularByPlural($value);
echo $singular_value;

出力値 : computer

Related

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...
トップへ戻る