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

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

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

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

正規表現

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

Q&A

4回答

8974閲覧

[PCRE]正規表現で空文字が通ってしまうのを阻止したい

sudoless

総合スコア8

PHP

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

正規表現

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

0グッド

0クリップ

投稿2015/07/08 10:50

編集2015/07/08 17:41

[A-Za-z0-9&()*#_カ-ドゲンキン]

上記の文字クラス以外を弾くイメージを描いているんですが、空白文字も通ってしまいます。何かいい方法あれば教えてください。

※訂正
×空白文字
◯空文字

$value = "";
if ( preg_match('/[^A-Za-z0-9&()*#_カ-ドゲンキン]/', $value)) {
//error

}

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

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

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

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

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

guest

回答4

0

空白文字も通ってしまいます。

なにか、勘違いをしているのでは?

lang

1<?php 2$value = " "; 3if ( preg_match('/[^A-Za-z0-9&()*#_カ\-ドゲンキン]/',$value)) { 4 echo "ERROR\n"; 5}

ちゃんとERRORと表示されますけど。

コメントに対しての追記。

正確には空白文字ではなく、空文字です。

そういうことだと、「条件に合う文字だけで1文字以上」の否定(!)に変えた方が良いかも。

lang

1<?php 2$value = " "; 3if ( !preg_match('/\A[A-Za-z0-9&()*#_カ\-ドゲンキン]+\z/',$value)) { 4 echo "ERROR\n"; 5}

投稿2015/07/08 15:14

編集2015/07/08 22:06
otn

総合スコア84529

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

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

sudoless

2015/07/08 17:37

申し訳ありません。私の説明が不十分でした。 正確には空白文字ではなく、空文字です。 $value = ""; 上記だと、通ってしまうという事を伝えたかったのです。
otn

2015/07/08 22:19

追記しました。
sudoless

2015/07/09 00:39

追記ありがとうございます。 確かに、おっしゃるとおりですね。 ありがとうございます。 余談ですがオライリー本でも、^$より\A\Zを推奨していました。
guest

0

少々力技ですが、例外条件をはじくケースの場合は、以下のようにOR条件を重ねる方法があります。

lang

1$value = ""; 2 if (( preg_match('/[^A-Za-z0-9&()*#_カ\-ドゲンキン]/', $value)) 3 || ($value == "") || ($value == null)) 4{ 5 //error 6 7 }

投稿2015/07/09 00:35

KenjiObata

総合スコア440

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

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

sudoless

2015/07/09 00:50

回答ありがとうございます。 確かにそうですね、この形も考えました。 説明不足で申し訳ありませんが、正規表現だけで完成させたかった事もあります
guest

0

これで空文字は阻止できるようになった
preg_match('/[^A-Za-z0-9&()*#_カ-ドゲンキン]|^$/', $value);

投稿2015/07/08 17:51

sudoless

総合スコア8

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

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

0

アスタリスク(*)が入っていますが、これはそのまま処理させたいんですよね(アスタリスクとして)?
であれば、アスタリスクをエスケープすればいいかと。

\*

アスタリスクはメタ文字でワイルドカード文字になるので、これに引っかかっているんじゃないかなぁ。

投稿2015/07/08 12:07

archiver

総合スコア1557

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

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

ngyuki

2015/07/08 12:37

うーん、文字クラスの中はほとんどのメタ文字はエスケープ不要になるはずです。 var_dump(preg_match('/[.*]/', "a")); // int(0)
sudoless

2015/07/08 17:54

>archiverさん 投稿ありがとうございます >ngyukiさん おっしゃるとおりですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問