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

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

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

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

正規表現

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

Q&A

解決済

2回答

2719閲覧

英字数字が少なくても一文字以上含まれている正規表現

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

正規表現

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

0グッド

1クリップ

投稿2019/09/03 00:27

編集2019/09/03 00:43

PHPの正規表現のパターンで英字数字が少なくても一文字以上含まれていることだけを検証したい場合は、以下のパターンで正しいでしょうか?

if(!preg_match('/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]\z/i',$password)){ $errors['not_match_password'] = '英字と数字両方を含むパスワードを入力してください'; }

追記
正規表現のパターンはこちらの記事を参考にしました。

現状、パスワードに英字と数字両方を入力しても正規表現パターンにマッチしないといった状態です。
以下は、バリデーションチェックを行っているコードの詳細になります。

<?php $errors = []; $nick_name = filter_input(INPUT_POST,'nick_name'); $nick_name = trim(mb_convert_kana($nick_name,'s','UTF-8')); $email = filter_input(INPUT_POST,'email'); $email = trim(mb_convert_kana($email,'s','UTF-8')); // var_dump($email); $password = filter_input(INPUT_POST,'password'); $password_check = filter_input(INPUT_POST,'password_check'); $family_name_kanji = filter_input(INPUT_POST,'family_name_kanji'); $family_name_kanji = trim(mb_convert_kana($family_name_kanji,'s','UTF-8')); $first_name_kanji = filter_input(INPUT_POST,'first_name_kanji'); $first_name_kanji = trim(mb_convert_kana($first_name_kanji,'s','UTF-8')); $family_name_kana = filter_input(INPUT_POST,'family_name_kana'); $family_name_kana = trim(mb_convert_kana($family_name_kana,'s','UTF-8')); $first_name_kana = filter_input(INPUT_POST,'first_name_kana'); $first_name_kana = trim(mb_convert_kana($first_name_kana,'s','UTF-8')); $year = filter_input(INPUT_POST,'year'); $month = filter_input(INPUT_POST,'month'); $day = filter_input(INPUT_POST,'day'); if(!$nick_name){ $errors['empty_nick_name'] = 'ニックネームが入力されていません'; }else{ if(mb_strlen($nick_name,'UTF-8') > 20){ $errors['over_nick_name'] = 'ニックネームは20文字以内で入力してください'; } } if(!$email){ $errors['empty_email'] = 'メールアドレスが入力されていません'; }else{ if(!filter_var($email,FILTER_VALIDATE_EMAIL)){ $errors['email_format_err'] = 'メールアドレスの形式が正しくありません'; } } if(!$password){ $errors['empty_password'] = 'パスワードを入力してください'; }else{ if(mb_strlen($password,'UTF-8') < 7 || mb_strlen($password,'UTF-8') > 128 ){ $errors['less_password'] = 'パスワードは7文字以上128文字以下で入力してください'; } if(!preg_match('/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]\z/i',$password)){ $errors['not_match_password'] = '英字と数字両方を含むパスワードを入力してください'; } } foreach($errors as $err){ echo $err . "<br>"; }

html部分は以下になります。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>test</title> <script src="https://www.google.com/recaptcha/api.js"></script> </head> <body> <h1>会員情報入力</h1> <form action="form_check1.php" method="post" id="user_register_form"> <p>ニックネーム <input type="text" name="nick_name" placeholder="例)太郎"> </p> <p> メールアドレス <input type="email" name="email" placeholder="PC・携帯どちらでも可"> </p> <p> パスワード <input type="password" name="password" placeholder="7文字以上"> </p> <p> パスワード(確認): <input type="password" name="check_password" placeholder="7文字以上"> </p> <p> お名前(全角) <input type="text" name="family_name_kanji" placeholder="例)山田"> <input type="text" name="first_name_kanji" placeholder="例)太郎"> </p> <p> お名前カナ(全角) <input type="text" name="family_name_kana" placeholder="例)ヤマダ"> <input type="text" name="first_name_kana" placeholder="例)タロウ"> </p> <p> 生年月日 <select name="year" id="year_id"> </select> <select name="month" id="month_id"> </select> <select name="day" id="day_id"> </select> </p> <div class="g-recaptcha" data-sitekey="sitekey"></div> <input type="submit" value="送信"> </form> </body> <!-- <script src="ja/validation.js"></script> --> </html>

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

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

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

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

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

Zuishin

2019/09/03 00:34 編集

どこから見つけてきたものか知りませんが、余計なものが多いです。 正規表現について基礎的な知識を身に着ける方が、適当に検索して行き当たりばったりで使うより効率的です。 正規表現は言語によって違うので、正規表現について聞く場合にはその言語名を明記してください。タグには PHP とありますが、初心者の場合はタグを間違って付けている場合も多く、信頼できません。 また、文字列リテラルの問題があるので、正規表現だけではなく呼び出しまで含めてコードを書いてください。
退会済みユーザー

退会済みユーザー

2019/09/03 00:45

nanami12さん こういったサービスもあるのですね。ありがとうございます!
guest

回答2

0

直接の答えは"質問の正規表現は何にもマッチしない"ですね。

(?=.*?[a-z])(?=.*?\d)は(マッチするなら)先頭で長さ0でマッチします。
そのあとに[a-z\d]\zが続きますが、[a-z\d]の部分は英数字の長さが1の文字、その直後に文末が来ます。

つまり、英文字を最低1文字含み、かつ、数字を最低1文字含む、英数字の長さ1の文字列にマッチする正規表現ということになります。
そんなものはありえないです。

投稿2019/09/03 00:56

編集2019/09/03 00:57
quickquip

総合スコア11038

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

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

退会済みユーザー

退会済みユーザー

2019/09/03 01:07

ご回答ありがとうございます。 正規表現は苦手で検索で調べたものを使っているのですが、それをなんとなく改良したのですが、ダメでしたね... yamabeさんにご回答頂いたコードで代替させて頂きたいと思います。
guest

0

ベストアンサー

含まれているのだけチェックしたいなら先頭とか末尾など指定は不要です

PHP

1$array=["a1","aa","1a","11","a_1","a_a","1_a","1_1","B1","BB","1B","B_1","B_B","1_B"]; 2$pattern="/[a-z].*\d|\d.*[a-z]/i"; 3foreach($array as $str){ 4 if(preg_match($pattern,$str)){ 5 print $str."<br>"; 6 } 7}

まぁいちいち組み合わせを考えるよりはand検索すればよいような気がします

PHP

1$array=["a1","aa","1a","11","a_1","a_a","1_a","1_1","B1","BB","1B","B_1","B_B","1_B"]; 2$pattern1="/[a-z]/i"; 3$pattern2="/\d/"; 4foreach($array as $str){ 5 if(preg_match($pattern1,$str) and preg_match($pattern2,$str)){ 6 print $str."<br>"; 7 } 8}

投稿2019/09/03 00:44

編集2019/09/03 00:48
yambejp

総合スコア114784

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

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

退会済みユーザー

退会済みユーザー

2019/09/03 01:02

ご回答ありがとうございます。 確かに、自分は正規表現苦手ですし「and」を使った方のコードが良いかもしれないです... yamabe.jpさんはこのような正規表現を、ある程度は調べずに書くことができるのでしょうか? 自分は、正規表現が苦手で、大抵検索で調べたものを貼り付ける感じで済ませてしまっているもので...
Zuishin

2019/09/03 01:30

こんな初歩的な正規表現で「ある程度」とは失礼な。
m.ts10806

2019/09/03 02:37

調べたものを使うのが悪いとは思わないですが、 それぞれ何を意味しているか理解しようともしなければ、単純な理屈で、苦手なものも一生得意にはなりませんよね。 得意になろう(または使えるようになろう)と思ってないのならそれで良いでしょうけど、「ここで詰まってるのが勿体ない」と思えたならZuishinさんが別途コメントされてるように基礎的な知識を身に付けてください。 これは正規表現に限らず同じです。コピペや写経で「できたつもり」になっている人が一番成長しませんので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問