PHPでアクセント記号付きのアルファベットを含む文字列のチェック方法

こんにちは、さるまりんです。

入力文字列のチェック、バリデーションっていろいろありますよね。
数字、半角英字、メールアドレス等、いろんなパターンがあります。

アルファベットでもアクセント記号付きのものを含む文字列をテストするにはどうするでしょう?

文字列のチェックは正規表現を使うことがよくあります。
ここでもそれでやってみたいと思います。

関数にしてみました。

function isAccentedAlpha($str) {
    // アルファベットとアクセント記号付きの文字(大文字・小文字)を含むパターン
    $pattern = '/^[\p{Latin}]+$/u';

    return preg_match($pattern, $str) ? true : false;
}

/uは正規表現がUTF-8エンコーディングに対応することを示し、\p{Latin}は「すべてのラテン文字(アクセント記号付きも含む)」を対象にします。
preg_match関数でこの正規表現を使って、文字列が一致したときはtrue、それ以外はfalseでチェックしています。

こんな風に使います。

$input = "Café ensueño";
echo "[$input] is " . (isAccentedAlpha($input) ? "" : "not ") . "an accented alpha string\n";
$input = "カフェ エンスエニョ";
echo "[$input] is " . (isAccentedAlpha($input) ? "" : "not ") . "an accented alpha string\n";

実行するとこうなります。

[Café ensueño] is not an accented alpha string
[カフェ エンスエニョ] is not an accented alpha string

どちらもfalseと判断されています。
「カフェ エンスエニョ」はカタカナなのでfalseになりますね。
“Café ensueño”の単語、”Café”にも”ensueño”(スペイン語で「夢」の意味です)にも記号付き文字が入っています。
ならばなぜfalse?
“Café ensueño”には半角スペースが含まれているからです。

では、半角スペースも許可するようにしてみます。

function isAccentedAlphaSpace($str) {
    // アルファベットとアクセント記号付きの文字(大文字・小文字)と半角スペースを含むパターン
    $pattern = '/^[\p{Latin}\s]+$/u';

    return preg_match($pattern, $str) ? true : false;
}

\sを追加しています。これでスペースも許可されます。
この関数を使い次のようにチェックしてみます。

$input = "Café ensueño";
echo "[$input] is " . (isAccentedAlphaSpace($input) ? "" : "not ") . "an accented alpha string\n";
$input = "カフェ エンスエニョ";
echo "[$input] is " . (isAccentedAlphaSpace($input) ? "" : "not ") . "an accented alpha string\n";

同様に実行してみます。

[Café ensueño] is an accented alpha string
[カフェ エンスエニョ] is not an accented alpha string

今度はうまく動きましたね。

数字と記号も許可したい?
その場合は正規表現を'/^[\p{Latin}\p{N}\s]+$/u'に変えます。
\p{N}が数字にあたりこれで数字も許可するチェックに変わります。

function isAccentedAlphaNumSpace($str) {
    // アルファベットとアクセント記号付きの文字(大文字・小文字)と数字と半角スペースを含むパターン
    $pattern = '/^[\p{Latin}\p{N}\s]+$/u';

    return preg_match($pattern, $str) ? true : false;
}

正規表現ってパワフルです。
もっと勉強しようと思います。

読んでくださってありがとうございます。

それではまた!