2023.04.10
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
挨拶
みなさま、初めての方ははじめまして。
そうでない方はお久しぶりです。 とみーです。
突然ですが、ゲームやSNSなどでこんな経験に出会った事がありませんですか?
「俺(私)の使ってる名前が既に使われてるんだけど!?」
あれは悲しいものです。 それが小さい頃からずっと使ってる名前だったら尚更です。
自分なんかはできる事なら、自分のアカウント名を予約してしまいたいなどと考えてしまいます。
前提条件
あなたは、自分で小規模なSNSツールを作って、みんなに公開しようとしてました。
そんな時、友達の「たろう」くんから、こんな頼み事をされてしましました。
「僕の【たろう】って名前を、登録できないようにしてくれないかな?」
あなたは承諾して、さっそく【たろう】で登録しようとしたらダメだと判定する処理を作り始めました。
実装方法(初期編)
さて、本題の作り方です。
特定の名前が使えないように、下記の2条件を満たすように作りたいと思います。
- 【たろう】という名前が入力された時に、「【たろう】は登録できない名前です。」と表示
- 【たろう】以外の名前が入力された時に、「使っても大丈夫な名前です。」と表示
それをもとに作成したものが、下記となります。
$input_name = 'たろう';
$ng_name = 'たろう';
$cant_use_name = preg_match("/".$ng_name."/u", $input_name, $match_names);
if ($cant_use_name) {
$match_name = implode(',', $match_names) ?? '';
echo "【".$match_name."】は登録できない名前です。";
} else {
echo "使っても大丈夫な名前です。";
}
preg_match という関数は、結果には比較マッチしたか否かの値が入ってきます($cant_use_name)。
第三引数には、一致した場合の名前が配列型で入ってきます($match_names)。
これで【たろう】という名前を入力したら、登録できないと返してくれるものが出来ました!
めでたし、めでたし。。。?
名前が登録できない、というバグ連絡
これで大丈夫、と公開をしたら「自分の名前が登録できない!」と連絡がきました。
友達の【しんたろう】くんと、【たろうまる】くんです。
「○たろう」や「たろう○」のように、名前の中に【たろう】が入ってたら反応してしまうのでした。
さて、これはどうやって解決すれば良いのでしょうか。。。
実装方法(修正編)
修正は、下記の2条件を追加して作成します。
- 入力された名前が【○たろう、たろう○】なら、判定OK
- 【たろう】の文字だけの場合、判定NG
その2条件を満たすために、入力された名前が【○+たろう、たろう+○】だったら
判定する処理上では消しちゃいましょう。
そして、残った名前の中に【たろう】が入ってないか、チェックする形に書き換えましょう。
それをもとに作成したものが、下記となります。
// 入力された名前が、【○+たろう】,【たろう+○】だったら、判定処理上では消してしまう
$input_name = 'しんたろう';
$allow_replace_name = preg_replace("/.+たろう|たろう.+/u", '', $input_name);
// NGの名前が入ってないか確認
$ng_name = 'たろう';
$cant_use_name = preg_match("/".$ng_name."/u", $allow_replace_name, $match_names);
if ($cant_use_name) {
$match_name = implode(',', $match_names) ?? '';
echo "【".$match_name."】は登録できない名前です。";
} else {
echo "使っても大丈夫な名前です。";
}
これで【たろう】という名前は「登録できない名前です。」と注意を促し、
名前の中に「たろう」が入ってる人は無事登録できるようになりました。
注意事項
今回は【たろう】くんだけでしたが、他の方が「自分も登録できないようにして欲しい!」とか
「ひらがなだけじゃなくて、漢字やカタカナの名前も登録不可にして!」などと言われると
登録不可ワード判定はどんどん複雑で、大規模なものになっていき、
「実装方法(初期編)」の後にあった、思わぬバグ連絡が来るかもしれません。
まずは一度、本当にその機能が必要なのか確認し、その上で注意しつつ作っていければ良いかと思います。
終わりに
ここまで読んでくれた皆様方、お時間を頂きありがとうございました!
またお会いする機会があればよろしくお願い致します!