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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

1450閲覧

PHPで「何も入力がないこと」を判定したい

hachuu-rui

総合スコア1

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

1クリップ

投稿2020/07/20 11:56

コメントフォームで「何も入力がない」という投稿を禁止したいです。

たとえば以下だけの入力の場合です。
・スペース
・改行
・空文字
・タブ

コメント本文はMySQLの「NOT NULL」なカラムに保存されるので、そこにINSERTする前にPHPでバリデーションをかけることを考えています。

そのために以下正規表現を考えたのですが、||での区切りに納得がいきません。
正規表現一発ですべて判定できたりしないものでしょうか?

php

1$value = ' '; 2if ( trim($value) == '' || preg_match("{^(\s| )+$}", $value) ) { 3 echo '空文字、半角スペース、全角スペース、タブ、改行だけでは入力できません'; 4} else { 5 echo 'OKです'; 6}

そしてむしろ、MySQL側で、「NOT NULL」と同じように「NOT 何も入力がない」という制約はできないでしょうか?(できてもPHPでバリデーションすべき?)

ご意見、ご回答、どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

php

1$pattern="/\A(\s+|)\z/u"; 2

mysql側にやらせるのはやめたほうがいいでしょう

投稿2020/07/20 12:51

yambejp

総合スコア114769

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

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

hachuu-rui

2020/07/20 13:04

やはりPHP側でやるべきですよね。ありがとうございます。 「\A」「\z」も知りませんでした。いつも「^」「$」を使っていたので以後注意いたします。
hachuu-rui

2020/07/20 13:04

あと申し訳ございませんが、以下の記述が解読できません。 (\s+|) 「\s」だけや「+」ならわかるのですが、全体としてみますと… 簡単な日本語で言うと、どのような条件を意味していることになりますでしょうか?
yambejp

2020/07/20 13:06

空白文字かなにもないかつまり \A\s+\zか\A\zかということです
hachuu-rui

2020/07/20 13:14

なるほど。「|」は「または」ですが、この後ろに何もなく (●|) のようになっているとき、「●または空文字」を表現できるのですか。 空文字をどう表現すべきか考えあぐねて質問ではtrimを使っていたので、大変勉強になりました。 ただ、たびたび申し訳ございませんが改行もはじきたく、それはどのように追加されますでしょうか? こう…でしょうか? (\s+|\n|)
hachuu-rui

2020/07/20 13:15

いや連続改行もはじきたいので、やはりこうでしょうか? (\s+|\n+|)
yambejp

2020/07/20 13:15

改行は\sに含まれます
hachuu-rui

2020/07/20 13:18

知りませんでした… 完璧なご回答ありがとうございました。
yambejp

2020/07/20 13:21

$a=[" ","\t","\r","\n"," ","","\t \n \t"]; $pattern="/\A(\s+|)\z/u"; foreach($a as $v){ if(preg_match($pattern,$v)){ var_dump($v); print "<br>"; } }
hachuu-rui

2020/07/20 13:34

まさか検証まで…w御見それしました。 自身の検証では不安が残ったので、改めて安心できました。最後までどうもありがとうございました。
退会済みユーザー

退会済みユーザー

2020/07/20 13:43

\s* でよいかと。
yambejp

2020/07/20 14:23

あーたしかに
guest

0

明確な仕様が不明ですが、記述の範囲とコードを見ると「ホワイトスペースと全角スペース」のみで構成されている場合を判定したいということだと思うので、正規表現だけで記述可能です。

質問にある正規表現をもう少し頑張れば、たどり着けると思います。

以下余談

バリデーションはホワイトリスト方式で記述するのが適切です。
可能かどうか検討してみてください。

以下余談2

php で「NOT 何も入力がない」という表現は、empty() や isset() を使いますが、本件の仕様ではあまり役に立ちそうにないです。

参考:PHP 型の比較表

追記

trim で全角スペース対応ができるかやってみました。

php

1<?php 2$tests = [ 3' ',//スペース 4"\n",//改行 5'',//空文字 6"\t",//タブ 7' ',//全角スペース 8"\n\t  ",//混合 9"\n\thoge  ",//混合(stringあり) 10]; 11 12foreach($tests as $key => $test){ 13 echo $key . " : "; 14 echo trim($test)===""?"ホワイトスペース":"ホワイトスペースではない"; 15 echo PHP_EOL; 16} 17 18echo '全角スペースを trim' . PHP_EOL ; 19 20foreach($tests as $key => $test){ 21 echo $key . " : "; 22 echo trim($test, " \t\n\r\0\x0B ")===""?"全角またはホワイトスペース":"全角またはホワイトスペースではない"; 23 echo PHP_EOL; 24}
0 : ホワイトスペース 1 : ホワイトスペース 2 : ホワイトスペース 3 : ホワイトスペース 4 : ホワイトスペースではない 5 : ホワイトスペースではない 6 : ホワイトスペースではない 全角スペースを trim 0 : 全角またはホワイトスペース 1 : 全角またはホワイトスペース 2 : 全角またはホワイトスペース 3 : 全角またはホワイトスペース 4 : 全角またはホワイトスペース 5 : 全角またはホワイトスペース 6 : 全角またはホワイトスペースではない

投稿2020/07/20 12:39

編集2020/07/20 13:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hachuu-rui

2020/07/20 12:57

>「ホワイトスペースと全角スペース」のみで構成されている場合を判定したい いえ、判定したいのは以下だけの構成の場合です。 ・スペース ・改行 ・空文字 ・タブ
退会済みユーザー

退会済みユーザー

2020/07/20 13:06

ホワイトスペースのみであれば、trim で対応できますね。
hachuu-rui

2020/07/20 13:54

trimで対応できるというのがなぜかまったくわかっていませんでした。 なるほど!「該当文字をtrimの第二引数で指定し、その結果が""ならマッチ」という方法ですか! 目からうろこでした。 どうもありがとうございました!
hachuu-rui

2020/07/20 13:56

すみません実は「ホワイトスペース」が理解できていないのですが、「画面に何も入ってないように見えるものすべて」というニュアンスの言葉でしょうか? つまり以下はすべてホワイトスペースですか? ・スペース(半角スペース、全角スペース) ・改行 ・空文字 ・タブ しかし「ホワイトスペースと全角スペース」のように「全角スペース」を「ホワイトスペース」とは別に扱っていらっしゃるということは、うーん…???
退会済みユーザー

退会済みユーザー

2020/07/20 18:10

whitespace ですね。 trim の定義する whitespace は、公式の trim を調べてみると分かると思います。 実は文脈で変化する定義なので、都度調べることが必要なやつです^^; html の whitespace と微妙に違っていたりしますw
hachuu-rui

2020/07/20 20:00

なるほどtrimにおける定義がございましたか。どうもありがとうございました。大変ためになるみなさまのご回答に改めて感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問