この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン | |||
php_blacklist_whitelist [2018/09/28 14:25] 管理者 [正規表現 preg_match 方式] |
php_blacklist_whitelist [2018/12/20 09:05] (現在) 管理者 [正規表現 preg_match 方式] |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
+ | ====== PHP ブラックリスト&ホワイトリスト ====== | ||
+ | 入力された値が登録リスト(配列)に存在するか・存在しないか確認する方法 | ||
+ | |||
+ | ===== in_array方式 ===== | ||
+ | |||
+ | in_arrayは配列に値があるかを確認します。(注意:英語の大文字小文字も比較します) | ||
+ | |||
+ | <code php> | ||
+ | //入力 | ||
+ | $input='aaa'; | ||
+ | //リスト | ||
+ | $lists= array('aaa','bbb','ccc'); | ||
+ | |||
+ | if( in_array( $input , $lists , true) ) { | ||
+ | echo 'リスト一致'; | ||
+ | //ホワイトリストの場合は合格処理 | ||
+ | //ブラックリストの場合は拒否処理 | ||
+ | }else{ | ||
+ | echo 'リスト不一致'; | ||
+ | //ホワイトリストの場合は拒否処理 | ||
+ | //ブラックリストの場合は合格処理 | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== 正規表現 preg_match 方式 ===== | ||
+ | preg_matchで正規表現に一致するか確認します。正規表現を使うと部分一致・先頭一致・後方一致・大文字小文字の違いなどでも判定できます。(正規表現は難しいので後半に一例を上げます) | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | //入力 | ||
+ | $input='aaa'; | ||
+ | //リスト(正規表現) | ||
+ | $lists= array('/^aaa$/','/^bbb$/','/^ccc$/'); | ||
+ | |||
+ | $mach_flag=0; | ||
+ | foreach ($lists as $value){ | ||
+ | if( preg_match($value,$input) ){ | ||
+ | $mach_flag=1; | ||
+ | break; //マッチした時点でforeach中断し次へ進む | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if($mach_flag==1){ | ||
+ | echo 'リスト一致'; | ||
+ | //ホワイトリストの場合は合格処理 | ||
+ | //ブラックリストの場合は拒否処理 | ||
+ | }else{ | ||
+ | echo 'リスト不一致'; | ||
+ | //ホワイトリストの場合は拒否処理 | ||
+ | //ブラックリストの場合は合格処理 | ||
+ | } | ||
+ | ?> | ||
+ | </code> | ||
+ | |||
+ | ** 正規表現の一例 ** | ||
+ | ^リスト文字列^説明^ | ||
+ | |%%/aaa/%%|「aaa」が含まれる場合にマッチ、「**aaa**」や「xxx**aaa**xxx」にマッチ| | ||
+ | |%%/^aaa/%%|先頭が「aaa」で始まる場合にマッチ「**aaa**bc」にマッチするが「xaaa」にはマッチしない| | ||
+ | |%%/aaa$/%%|最後が「aaa」で終わる場合にマッチ「xx**aaa**」にマッチするが「aaax」にはマッチしない| | ||
+ | |%%/^aaa$/%%|完全一致、「**aaa***」の場合にマッチ、大文字の「AAA」にはマッチしない| | ||
+ | |%%/aaa/i%%|大文字小文字を区別しない、「xx**AAA**xx」や「xx**aAa**xx」にもマッチ| | ||
+ | |%%/^aaa/m%%|対象が複数行時に%%^%%と%%$%%を先頭と最後以外の各行頭と行末でもマッチ判定する| | ||
+ | |%%/a.*/s%%|パターン文字の%%.%%を改行でマッチ判定する| | ||
+ | |||
+ | ** メタ文字の注意 ** | ||
+ | |||
+ | リスト中で次の文字「''\ ^ $ . [ ] | ( ) ? * + { } -''」は正規表現の制御文字として使用するためリスト対象の文字列としてそのまま使用できません。必ずエスケープ処理を行って下さい。 | ||
+ | |||
+ | エスケープ方法は上記文字の前に「''\''」を付けます | ||
+ | |||
+ | <code> | ||
+ | $lists= array('/150$/'); //これだと「150」で終わデータにマッチ | ||
+ | $lists= array('/150\$/'); //これだと「150$」を含むデータにマッチ | ||
+ | </code> | ||
+ | |||