質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

2回答

3535閲覧

数字、特殊文字、カナ文字を条件によって弾きたいです

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

4グッド

1クリップ

投稿2019/09/05 00:17

編集2019/09/05 00:27

変数に、数字か特殊文字が含まれていた場合はエラーメッセージをエラー内容を格納する変数「$errors」に格納し、数字、特殊文字が含まれていない場合でも、カナ文字(カタカナ、ひらがな)以外が含まれている場合はエラーメッセージを「$errors」に格納したいと思っています。
以下のコードで試してみたのですが、「$first_name_kana」に文字列「あああ」が代入されていた場合、最初のif文の条件式ではFALSEになるのですが、次のif文ではtrueとなってしまいます。また、数字が$first_name_kanaに含まれていた場合は、最初のif文ではtrueになりますが、数字は2つ目のif文の条件式で評価し、エラーメッセージ「'名カナに数字や特殊文字は使用できません'」を$errorsに格納させたい為、この場合も意図した結果とはならないです。

php

1 var_dump($first_name_kana); 2 if(preg_match('/[^ぁ-んァ-ヶー]/u',$first_name_kana)){ 3 $errors['not_kana_charcters'] = '名カナはカナ文字を入力してください'; 4 }else if(preg_match('/[^a-zA-Z\s]/u',$first_name_kana)){ 5 $errors['format_err_first_name_kana'] = '名カナに数字や特殊文字は使用できません'; 6 }

こちらの問題を解決する為、解決法をご提示いただければ幸いです。

追記
エラー変数に格納するメッセージなのですが、仮に、$first_name_kanaに「あああ111」のように数字と文字列が格納されていた場合、数字が含まれている為、エラーメッセージとしては、「名カナはカナ文字を入力してください'」ではなく、「名カナに数字や特殊文字は使用できません」を格納したいです

toll_tree, aae_11, hyubyu-n1, newyee👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/09/05 00:25

「特殊文字」とは、どのような文字でしょうか。
退会済みユーザー

退会済みユーザー

2019/09/05 00:30 編集

>「特殊文字」とは、どのような文字でしょうか。 特殊文字は、「アルファベット、ひらがな、カタカナ、漢字、数字」以外を想定しています。
date

2019/09/05 00:32

カタカナ、ひらがなだけのチェックでいいと思う 数字はともかく、特殊文字まで含めるとかなり正規表現に詳しくないと分からないと思う
Orlofsky

2019/09/05 00:50

>「名カナはカナ文字を入力してください'」ではなく、「名カナに数字や特殊文字は使用できません」 名カナはカナ文字を入力してください でないと普通の人は理解できないかと。
退会済みユーザー

退会済みユーザー

2019/09/05 00:57 編集

>Orlofskyさん エラーメッセージに「名カナに数字や特殊文字は使用できません」「名カナはカナ文字を入力してください」この2つ含めるということでしょうか? どのケースの場合ですか?
Zuishin

2019/09/05 01:00

「特殊文字」という言葉も通じないのでエラーメッセージには不適切です。ここでも聞き返されてるでしょう?
Zuishin

2019/09/05 01:03

ユーザーにとっては特殊文字がどうとかはまるで関係なくて、とにかくどの文字が使えるのかだけが問題になります。平仮名と片仮名だけが使える仕様なら、そのように言わないとわかりませんし、それ以上の分類は必要ありません。
Zuishin

2019/09/05 01:05

「カナ文字(カタカナ、ひらがな)」と注釈を入れているのは、「カナ文字」だけでは回答者に通じないと思ったからでしょう? ならその配慮をユーザーにもしてください。
退会済みユーザー

退会済みユーザー

2019/09/05 01:06

あーなるほど。実は、某有名なECサイトを参考にフォームのチェック処理を作っていたのですが、エラーメッセージの内容は理解できたし、有名なサイトが使っているんだから、問題ないかなと思っていたんですよね。。
m.ts10806

2019/09/05 01:27 編集

>某有名なECサイト なんでしょう。そこ。有名ならむしろ出典として明示すべきですね。 メッセージだけマネたところでそのサイトの設計思想と質問者さんがやりたいこととが一致するわけではないので、むしろ「自分が全くコンピュータ分からない利用者になったときに伝わるか」という視点で設計しなおしてください。 作る側が理解できたとて使う側が理解できないと意味がありません。 (それに本気で要件詰めたいなら初心者には土台無理な課題です。要件も今一つ不明瞭だし、詰め切られていない。正規表現の基礎を勉強しなおしてから質問してください) あと初心者アイコンつけてください。つけ方が分からないなら聞いてください。私は分かるので。
m.ts10806

2019/09/05 01:35 編集

あと前の質問のベストアンサーに選ばれた回答のその後のコメントをきちんと読んでください。 https://teratail.com/questions/210002#reply-309761 要件と検証が不十分であることが分かると思います。なので、正規表現の基礎をきちんと修めた上でテストケースも作らないと同じ質問を繰り返しているだけの印象を与えています。 (この正規表現による一連の質問を見ている方はそう感じています。だからこれだけ指摘が来るのです。これを主観や個人の感想、想像と言い切るなら全員を黙らせるくらいのきちんとした質問を書いてから言ってください)
退会済みユーザー

退会済みユーザー

2019/09/05 01:41 編集

>dateさん 確かに、カタカナ、ひらがなだけのチェックだけでも良いですよね。 特殊文字や、数字は入力できないとのエラーメッセージは必要ないかもしれないですね
m.ts10806

2019/09/05 01:43 編集

あと、この手のバリデーションは「ブラックリスト方式」にするか「ホワイトリスト方式」にするかきちんと見極めないとロジックの難易度が段違いに上がりますし、悪手にしかならないことも多いです。 わざわざ難しい方を取る必要はないと思います(正規表現の勉強と言うならがんばってとしか言えませんが、ロジックを勉強したいならよりスッキリかける方法を熟考して選ぶべき。これは前からそれに近いことは言われているはず)
Orlofsky

2019/09/05 02:50

名カナはカナ文字を入力してください にしては?
date

2019/09/05 04:31

>特殊文字や、数字は入力できないとのエラーメッセージは必要ないかもしれないですね ss_111さんがそういう仕様を決めないとこれ以上話が進みませんね 私としてはフリガナはひらがなとカタカナどちらか片方だけ入力可にしたほうがいいです。ソート機能とか作るとひらがなとカタカナは別にソートされるので面倒な処理を挟む必要が出る 今の条件だと数字は半角全角英字も半角全角をチェックし記号の場合半角カナも条件を入れるとかすると特殊記号をチェックに入れるのはやめた方がいい そのECサイトは金がかかっているから厳重に作っている。勉強で作っているならこんなに厳重に作んなくてもいいんじゃないか、 それよりもこれで詰まって時間を使ってるならある程度妥協して作って作成数を増やしていく方がためになると思う
退会済みユーザー

退会済みユーザー

2019/09/05 05:14 編集

>dateさん もちろん仕様は変更するつもりです。 バリデーションに関しては、ある程度妥協して作っていこうと思います。
m.ts10806

2019/09/05 05:19 編集

間違えてます。 「変更」ではなく「詰める」「決める」です。dateさんも「決めて」と言っています。 もともときちんと詰まっているなら「変更」で良いでしょうが、全く詰まっていないのに「変更」にはなりません。 前の質問のベストアンサーに選んだ回答のその後のコメントを読めば詰まってないのに勢いで作ろうとしているのは明白です。 https://teratail.com/questions/210002#reply-309761
guest

回答2

0

ss_111さんの文章を引用すると仕様は下記4点の認識です。

  • 変数に、数字か特殊文字が含まれていた場合はエラーメッセージ
  • 数字、特殊文字が含まれていない場合でも、カナ文字(カタカナ、ひらがな)以外が含まれている場合はエラーメッセージ
  • 特殊文字は、「アルファベット、ひらがな、カタカナ、漢字、数字」以外を想定
  • 数字が$first_name_kanaに含まれていた場合はエラーメッセージ「'名カナに数字や特殊文字は使用できません'」

上の仕様を設計に起こすと以下のようなフローチャートになるのでしょうか。
フローチャート(before)

アルファベットや漢字はそもそも入力できない作りになっているのですから、設計がおかしいように思えます。
であれば、複数メッセージを用意するのではなく、エラー時は「ひらがな」と「カタカナ」しか入力できないと伝えた方がユーザーに混乱を招かないと思います。もっと言えば、placeholder等を使って入力前からその旨をユーザーに明示しておくのが良いと思います。
フローチャート(after)

ただし、私の提案が必ず正しいという訳ではありませんから、あくまで設計を見直す参考材料として見てください。

それよりも、この回答でss_111さんに伝えたいのは、下記の2つです。

  • 質問をする前に仕様を正確に決めること
  • 質問をする前に決めた仕様通りにお試しで作ること

まずss_111さんがやるべきことは仕様を誰(今回でいうとteratailユーザー)が見ても理解できるように見直すことです。
そして仕様と同じ動きをするようにコーディングしてください。

現時点の質問内容を見る限りでは

  • 仕様があやふやで会話のキャッチボールを何度もしないと話が進まない
  • コードが仕様通りに作られていないのでまだやること、考えることはあるように思える

ため、まだ質問する段階に至っていないと感じます。

投稿2019/09/05 06:34

BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/05 07:03 編集

ご回答ありがとうございます。 質問する段階に至っていないという点ですが、コードが仕様通りに作られていれば、質問する意味はないように思えるのですが、その点はいかが思いますでしょうか?
BluOxy

2019/09/05 07:54 編集

>コードが仕様通りに実現できていれば、質問する意味はない そうですね。 って、私が言いたいのはそういうことではありません。 私が言いたいのは「仕様通りに実現できていないなら質問するな」ではなく、「質問する前にまだやることや考えることはあるんじゃない」です。 仕様通りに実現できていない原因を特定できていて、原因究明のために(言語仕様や関数、正規表現などの)リファレンスを調べて実際に検証した上で、何がどうわからなかったのかを質問しているなら恐らく誰も指摘はしないでしょう。
退会済みユーザー

退会済みユーザー

2019/09/05 07:13

質問には、分からない点、及び実際に試したコードを記載していると思うのですが?
BluOxy

2019/09/27 04:41 編集

>以下のコードで試してみたのですが、~~この場合も意図した結果とはならないです。 分からない点というより、ただ「うまくいかなかった」と言っているだけではないでしょうか。 うまくいかなかったから、なぜ動かなかったのか、原因を考えませんでしたか。 「ロジックがおかしい」だとか、「正規表現の書き方がおかしい」だとか。何かしらは思いつくと思います。そして 何が問題か の切り分けぐらいはコードを理解していればできると思います。 できないのであれば、ifや変数、文字列、正規表現辺りの基礎を学び直すべきです。 なぜかと言うと、問題の切り分けができない訳ですからss_111さんにとって掲示されているコードはブラックボックス(中身がわからない)ということになります。 ブラックボックスになっているコードを提示して「解決法を教えてください」では本人が何も分からないのですから傍から見れば作業依頼とみられても仕方がありません。そうは思いませんか。 問題の切り分けができるのであれば、例えば カタカナとひらがなを判定するためにpreg_match('/[^ぁ-んァ-ヶー]/u',$first_name_kana)と書きましたが、「ひらがなだけ」もしくは「カタカナだけ」を入力したときに間違った判定がでました。 〇〇と試して正規表現が間違っていることは確認したのですが、そもそもこの正規表現が何を意味しているのか分からないため http://gimite.net/help/devas-ja/all_regex.htmlhttps://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php 辺りを参考にしました。 が、参考にしたページの△△の部分がなぜXXなのかが分かりません。 のように技術について伺う形の質問になるはずです。
BluOxy

2019/09/05 07:42

ここはあくまで技術的な問題を解決するサイトであり、仕様を満たすための解決策を考えてもらうサイトではないです。
maisumakun

2019/09/05 07:44

自分の回答とも重なりますが、(機械学習のような、使う側にもブラックボックスなものを使うような場合はまた別ですが)日本語で仕様を説明できないものはプログラムにも起こせません(プログラムを書く以前の問題、ということになります)。
BluOxy

2019/09/05 07:51 編集

です。まずは日本語でどういう動きをするか出来るだけ正確に書いてからコーディングをしましょう。 技術的な質問をするタイミングはそのときです。
退会済みユーザー

退会済みユーザー

2019/09/05 07:59

では、例えば仕様を実現する為、考えつく方法を試したが、実現できなかった。その場合に他に実現する方法がないか、アドバイスを求めるということもダメなのでしょうか?
maisumakun

2019/09/05 08:03

もちろん、設計段階での質問を求めることに問題はありません。ただ、「設計もできていないのに実装をする」のは意味がないので成立しない、という話です。
BluOxy

2019/09/05 08:19 編集

実現できなかった原因が妥当かどうかによります。 主観ですが、「実現できなかった」と言う人は98%ぐらいの割合で、参考にする情報を間違えていたり、コーディングや設計が適切ではなかったりしました。 なので、「何を参考にして」「どういうコードを書いて」駄目だったのかが回答者側にとって納得できる内容であれば他の方法を聞いても私はアリだと思います。
maisumakun

2019/09/05 08:05

(自分としては、使っているライブラリの問題とか設計思想とか、小手先で対応できそうにない問題がある質問の場合、そういったところを積極的に指摘するようにしています)
Zuishin

2019/09/05 08:09

仕様が固まっていないので、仕様を実現するために考え付く方法は試せていないはずです。 仕様が固まっていないなら、固めることがまず第一の目標となり、コーディングは次の目標となります。ですから、前段階を踏めてない以上、コーディングの質問をする段階にはありません。
退会済みユーザー

退会済みユーザー

2019/09/05 08:20 編集

なるほど。実装に関するの質問の場合、仕様を明確にしてあり、試したこと、調べたことを明記する必要があり、設計段階の質問も同様のことを記載してあれば、大丈夫ということですね
BluOxy

2019/09/05 08:22

「技術的な問題について」であれば、認識の通りで良いと思います。
guest

0

まずは、「やりたいこと」と「コードの内容」を日本語ベースで確認しましょう。

このままだと、

php

1 if(ひらがな・カタカナ以外の文字が入っている場合){ 2 $errors['not_kana_charcters'] = '名カナはカナ文字を入力してください'; 3 }else if(アルファベット・スペース以外の文字が入っている場合){ 4 $errors['format_err_first_name_kana'] = '名カナに数字や特殊文字は使用できません'; 5 }

となるので、「ひらがなだけ」「カタカナだけ」でもelse ifのほうへ進んでしまいます。

投稿2019/09/05 00:32

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/05 00:42

>「ひらがなだけ」「カタカナだけ」でもelse ifのほうへ進んでしまいます。 実は、ここなんですが、数字や特殊文字が含まれていた場合だけ条件式をTRUEにすることを考えた場合、一つの条件式で評価が可能かと思うのですが、数字や特殊文字は含まれていない場合はFALSEに、しかしカナ文字(カタカナ、ひらがな)でなかった場合は、また別の条件式で評価を行い、エラーメッセージを格納したいと考えた時に、方法が分からなくなってしまいまして...
maisumakun

2019/09/05 00:46

> 実は、ここなんですが、 それがわかっていたのなら、質問の時点で書いておきましょう。
maisumakun

2019/09/05 01:03

(ss_111さんの過去の質問とそこへの応対を確認した上で、このような形の回答が適切と考え行っています)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問