PHPで文字列が「ひらがな」であるかを正規表現でチェックする
正規表現を活用して、PHPで文字列が「ひらがな」であるかをチェックする方法について解説します。
基本的なパターン
文字列が1文字以上の「ひらがな」の組み合わせで構成される場合は、以下の正規表現パターンを使用できます。
このパターンでは、「^」が文字列の開始、「$」が文字列の終了、「[ぁ-ん]」が「ひらがな」の範囲を表します。そして「+」で1文字以上の繰り返しを指定しています。最後の「u」はUTF-8モードを指定するもので、日本語などのマルチバイト文字を正しく認識するために使われます。
踊り字、濁点、半濁点
「こゝろ」や「みすゞ」など、踊り字を含む「ひらがな」にマッチさせたい場合は、以下のパターンを使用できます。
ただし、このパターンは単独で出現する濁点「゛」や半濁点「゜」にもマッチするため、注意が必要です。
Unicodeプロパティエスケープ
上記に加えて「けーき」など長音を含む「ひらがな」や、「ゕ」、「ゖ」、「ゔ」、「ゟ」などの特殊な「ひらがな」を含める場合は、Unicodeプロパティエスケープを用いて以下のパターンを使用できます。
補足
本記事では、UTF-8エンコーディングを前提としています。
使用する正規表現ライブラリによって、パターン修飾子の指定方法などが異なる場合がありますので、詳細については正規表現ライブラリのドキュメントを参照してください。
以下にPHPでよく利用される正規表現パターンをまとめました。用途に応じてご活用ください。
# | マッチ条件 | 正規表現パターン |
---|---|---|
1 | すべて「ひらがな」 | ^[ぁ-ん]+$ ^[\p{Hiragana}]+$ |
2 | 固定長 n桁の「ひらがな」 | ^[ぁ-ん]{n}$ ^[\p{Hiragana}]{n}$ |
3 | n桁以上の「ひらがな」 | ^ぁ-ん]{n,}$ ^[\p{Hiragana}]{n,}$ |
4 | m桁以下の「ひらがな」 | ^[ぁ-ん]{1,m}$ ^[\p{Hiragana}]{1,m}$ |
5 | n桁以上m桁以下の「ひらがな」 | ^[ぁ-ん]{n,m}$ ^[\p{Hiragana}]{1,m}$ |
ソースコード
次に、入力された文字列が「ひらがな」のみで構成されているかを判定するPHP関数を紹介します。この関数では、拡張性や将来的な対応を見据えてUnicodeプロパティエスケープを採用し、以下の条件に応じて検証が可能です。
- 最小桁数を省略した場合: 文字列が指定された最大桁数以内で、「ひらがな」のみで構成されていることを確認します。
- 最大桁数を省略した場合: 文字列が指定された最小桁数以上で、「ひらがな」のみで構成されていることを確認します。
- 最小桁数・最大桁数を省略した場合: 文字列全体が、「ひらがな」のみで構成されていることを確認します。
/**
* 文字列が「ひらがな」のみで構成されるかをチェックします。
*
* @param string $str 入力文字列
* @param ?int $minLength 最小桁数 (nullの場合は1として扱います)
* @param ?int $maxLength 最大桁数 (nullの場合は文字列の長さを最大値として扱います)
* @return bool 入力文字列が条件を満たす場合はtrue、それ以外はfalseを返します。
* @throws InvalidArgumentException 最小桁数 が 1 未満の場合、または 最大桁数 が 最小桁数 未満の場合に例外が発生します。
*/
function isHiragana(string $str, ?int $minLength = null, ?int $maxLength = null): bool {
// デフォルト値を設定
$min = $minLength ?? 1;
$max = $maxLength ?? mb_strlen($str);
// 引数のバリデーション
if ($min < 1) {
// 最小桁数が1未満の場合に例外をスロー
throw new InvalidArgumentException('最小桁数は1以上の整数である必要があります。');
}
if (!is_null($maxLength) && $max < $min) {
// 最大桁数が最小桁数未満の場合に例外をスロー
throw new InvalidArgumentException('最小桁数は最大桁数以下である必要があります。');
}
// 「ひらがな」の正規表現パターンを構築
$pattern = is_null($maxLength)
? sprintf('/^[\p{Hiragana}]{%d,}$/u', (int)$min) // 最大桁数が無制限の場合
: sprintf('/^[\p{Hiragana}]{%d,%d}$/u', (int)$min, (int)$max);
// 正規表現によるチェック
return (bool)preg_match($pattern, $str);
}
検証
範囲はバイト数ではなく桁数(文字数)で指定してください。