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

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

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

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

正規表現

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

Q&A

解決済

2回答

3898閲覧

preg_matchする際の記号に対する正規表現の書き方を知りたい

taiyo-2017

総合スコア49

PHP

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

正規表現

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

0グッド

0クリップ

投稿2020/10/02 09:24

編集2020/10/05 04:12

phpでパスワードのチェックを行うようにしているのですが、
下記のようにすることで数値、記号(ASCIIコード表に記載されている記号全て)、半角英字(大文字)、半角英字(小文字)のすべてを含むようにチェックしようとしています。

php

1if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#()=~^|`{};+:\-<>,._[]\\])[A-Za-z\d@$!%*?&#()=~^|`{};+:\-<>,._[]\\]{10,30}$/',$data['password'])) { 2  /* エラー時の処理 */; 3}

しかし、現時点ではシングルクォートを入力しても記号として判断されずエラーとなってしまいます。
preg_match()にシングルクォートも含めたいのですが、文字を囲む際にシングルクォートを使用しているため、どう指定するのかが分かりません。
この場合はどういう書き方をすることでシングルクォートも含めることができるのでしょうか?

また、preg_match()内の記号を判定する箇所がとてもスマートではないことは承知なのですが、記号全ての指定の方法が分かりません…
もっとよい書き方はあるのでしょうか?

アドバイスをよろしくお願いいたします。

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

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

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

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

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

yambejp

2020/10/02 09:30 編集

条件をもっと明確にしてください ヒットしていい文字列を羅列してもらえるとよいかと
Daregada

2020/10/02 09:33

正規表現を使わないで処理したほうが楽なやつでは。
taiyo-2017

2020/10/02 09:34

エラーと判断しない文字列の条件でしょうか? 半角の数値(0~9)、記号(ASCIIコード表に記載されている記号全て)、半角英字(A~Z)、半角英字(a~z)をそれぞれ1文字以上含む10文字以上30文字以下の文字列がエラーとならない文字列になります。
taiyo-2017

2020/10/02 09:35

正規表現を使用しない方が楽とのことですが、その場合はどのような書き方になるのでしょうか?知識が浅くすみません…ご教授いただければ幸いです。
yambejp

2020/10/02 09:37

> ASCIIコード表に記載されている記号全て が怪しい。コードの何番から何番ってちゃんと指定しないと抜けや余計なものがでてくるでしょう
taiyo-2017

2020/10/02 09:49 編集

カンマも含みますが、カンマ区切りにしてしまったため少し見づらくなりましたが下記の文字を許可するようにしたいです。 !,",#,$,%,&,',(,),*,+,,,-,.,/,:,;,<,=,>,?,@,[,\,],^,_,`,{,|,},~ 空白等は許可しないようにしたいです。 ASCIIコード表の番号で言えば 33~47、58~64、91~96、123~126になります。 表現が分かりづらく失礼いたしました。
yambejp

2020/10/05 03:48

「正規表現」タグをつけておいてください
guest

回答2

0

ベストアンサー

シングルクォートも含めたいのですが、

\'と書きます。

記号全ての指定の方法が分かりません…

[[:punct:]]で記号にマッチします。

投稿2020/10/02 09:34

otn

総合スコア85901

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

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

taiyo-2017

2020/10/04 23:57

ありがとうございます。 [[:punct:]]で指定ができるのは初めて知りました。 ですが、どうやらエスケープ文字が必要となる¥などは含まれていないようなので、 今回の場合が記号全てをこれで対応することはできないのですね。 ですが、知識として身につけることができました!
otn

2020/10/05 00:15

当然、\ なども含まれていますよ。除外する理由が無い。 preg_match("/[[:punct:]]/","\") => 1
taiyo-2017

2020/10/05 00:31

調べた際にそう書かれていたと思ったのですが勘違いなのですね。失礼いたしました。 if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[:punct:])[A-Za-z\d[:punct:]]]{10,30}$/', $data['password'])) {} という書き方をすると「compilation failed posix named classes are supported only within a class」エラーとなるのですが、質問時のif内の記号を[:punct:]にするだけでは使い方が異なるのでしょうか?なんども質問をしてしまいすみません。
otn

2020/10/05 00:34

[:punct:] じゃないです。[[:punct:]]と書いたのですが。。。。
taiyo-2017

2020/10/05 00:41

失礼いたしました。転記ミスです。 if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[[:punct:]])[A-Za-z\d[[:punct:]]]{10,30}$/', $user['password'])) {} こういった形にしているのですが、エラーとなってしまいます。 正規表現の書き方に問題があるかと思うのですが、どこに問題があるのかが分からない状態です。
taiyo-2017

2020/10/05 00:51

if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[[:punct:]])[A-Za-z\d[:punct:]]{10,30}$/',$user['password'])) {} にすると正常に動作しているようでした。 失礼いたしました。
guest

0

PHP

1$pattern="/\A(?:([!-\/:-@[-`{-~])|(\d)|([a-z])|([A-Z])){10,30}\z/"; 2if(!preg_match($pattern,$str,$match) or !array_reduce($match,function($x,$y){return $x*=strlen($y);},1)){ 3 print "err"; 4}

投稿2020/10/02 09:34

編集2020/10/02 10:53
yambejp

総合スコア116724

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

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

yambejp

2020/10/02 10:53

調整版あげておきました
taiyo-2017

2020/10/04 23:59 編集

ありがとうございます。 実装して確認をしてみたのですが、abcdef123!という文字であってもエラーにならず通ってしまうようです。Abcdef123!などのように大文字小文字数値記号の全て含まれている場合のみOKとしたいです。 また、$pattern="/\A(?:([!-\/:-@[-`{-~])|(\d)|([a-z])|([A-Z])){10,30}\z/"; の「/\A(?:」の箇所が少し理解できていないのですが、何かの指定になるのでしょうか? 質問ばかりですみません。
yambejp

2020/10/05 03:43 編集

失礼しました。これでどうですか? $str="abcdef123!"; $pattern="/\A(?:([!-\/:-@[-`{-~])|(\d)|([a-z])|([A-Z])){10,30}\z/"; if(!preg_match_all($pattern,$str,$match) or !array_reduce($match,function($x,$y){return $x*=strlen($y[0]);},1)){ print "err"; }
taiyo-2017

2020/10/05 04:17

何度もありがとうございます。思っていた結果となりました! preg_match_allとpreg_matchで検索が異なるのですね。 デバッグしながら動作についても勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問