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

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

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

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

正規表現

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

Q&A

解決済

2回答

1581閲覧

正規表現がうまくマッチしません。

pgn

総合スコア11

PHP

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

正規表現

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

0グッド

0クリップ

投稿2016/11/02 02:18

編集2016/11/02 05:07

###前提・実現したいこと

パスワードの入力チェックをしたいです。

条件
・半角英数記号混合、ただし英数は必須
・3文字以上連続の場合NG
・許可文字以外が含まれている場合NG

###発生している問題・エラーメッセージ

・記号の3文字連続がひっかからない
・許可以外の記号(たとえば<>など)が含まれていてもひっかからない

###該当のソースコード

// 許可記号 $escaped = preg_quote('!#$%()*+-./:;=?@[]^_`{|}', '/'); // 3文字以上連続の場合、NG if (preg_match("/([{$escaped}a-zA-Z0-9])\1{2,}/", $value) !== 0) { return error(); } // 半角英+数字記号混在でない場合、NG if (preg_match("/[a-zA-Z]+/", $value) == 1){ if(preg_match("/[{$escaped}0-9]/", $value) == 0) { return error(); } }else{ return error(); } // 許可文字以外が含まれている場合、NG if (preg_match("/[^{$escaped}a-zA-Z0-9]/", $value)) { return error(); }

###その他

内部エンコーディングはEUCです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

""が一つphpで食べられてしまった為ではないでしょうか?

if (preg_match("/([{$escaped}a-zA-Z0-9])\1{2,}/", $value) == 1) {

投稿2016/11/02 04:02

A.Ichi

総合スコア4070

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

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

pgn

2016/11/02 05:09

ありがとうございました!! ご指摘通り修正するとうまくいきました。 あともう一つの問題 ・許可以外の記号(たとえば<>など)が含まれていてもひっかからない についても間違いがありますでしょうか・・・
pgn

2016/11/02 05:46

すみません!他の問題があったようで、2つ目の問題は解決しました! ありがとうございました!!
A.Ichi

2016/11/02 05:50

その様ですね。正しく1が戻っています。
guest

0

preg_match()!==0
って変じゃないですか?
くらべるならfalse
(間違った回答ですが自戒もこめて残しておきます)

#追記
「\1」→「\1」はどうでしょうか?

投稿2016/11/02 02:28

編集2016/11/02 02:55
yambejp

総合スコア114777

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

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

KiyoshiMotoki

2016/11/02 02:39 編集

・マッチしなかった場合だけ、return error(); を実行する。 ・マッチした場合、およびエラーが発生した場合は 以降の処理を実行する。 という意図であれば、正当な実装です。 http://php.net/manual/ja/function.preg-match.php > 返り値 > preg_match() は、pattern が指定した subject にマッチした場合に 1 を返します。 マッチしなかった場合は 0、エラーが発生した場合は FALSE を返します。 エラーの場合にどうするのが良いかは議論が分かれそうですが。
yambejp

2016/11/02 02:45

KiyoshiMotokiさん、ご指摘ありがとうございます スミマセン適当なことを書いちゃったみたいで たしかにpreg_matchの戻り値はintでした
KiyoshiMotoki

2016/11/02 02:52 編集

yambejp様 私の指摘も間違いでした。 正しくは ・マッチした場合、およびエラーが発生した場合は、return error(); を実行する。 ・マッチしなかった場合だけ、以降の処理を実行する。 ですね (^^;
yambejp

2016/11/02 02:55

とりあえず本題の指摘だけはしておきます
pgn

2016/11/02 05:12

ありがとうございます。 なんとなくの理解でしたので、勉強になりました!! preg_match()!==0 と preg_match()==1 は同じと思っていました・・・ ・記号の3文字連続がひっかからない はご指摘通りの修正でうまくうごきました! ・許可以外の記号(たとえば<>など)が含まれていてもひっかからない は、やはりうまくいきません。 どこが問題でしょうか(><) よろしくお願いいたします。。。
yambejp

2016/11/02 05:45

許可文字以外はご提示のものでヒットしますよね? $value="a<b"; $escaped = preg_quote('!#$%()*+-./:;=?@[]^_`{|}', '/'); $pattern="/[^{$escaped}a-zA-Z0-9]/"; if (preg_match($pattern, $value)) { print "error"; }
pgn

2016/11/02 05:46

すみません!他の問題があったようで、2つ目の問題は解決しました! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問