95199
PHPにてDBをUPDATEするためのソースを記述していて、バリデーションのためにIFでチェック  
しようとしています。  
しかしながら、「英数字記号以外ならばtrueを返してエラーを表示」すると記述している  
つもりですが、英字のみで書いてもエラーになってしまいます。  
エラー内容は「ユーザー・パスワードは半角英数字記号で入力します。」です。  
試しに英数字記号（英字は大文字・小文字含む）を全て含めてみても結果は同じでした。  
原因と思われる部分をお聞かせいただきたく存じます。  
コードを添付します。

```

    <?php 
    var_dump($_REQUEST['password']);
    try{
        require_once('db_connect.php');
        $sql=$pdo->prepare('update user_table set last_name=?, first_name=?, last_name_kana=?, first_name_kana=?, user=?, password=? where id=? ');
            if(empty($_REQUEST['sei']) || empty($_REQUEST['mei']) || empty($_REQUEST['sei_kana']) || empty($_REQUEST['mei_kana']) || empty($_REQUEST['user']) || empty($_REQUEST['password']))
                {
                    echo '未入力の項目があります。';
                }
                else if(!preg_match('/\A[ア-ヿ]+\z/u', $_REQUEST['sei_kana']) || !preg_match('/\A[ア-ヿ]+\z/u', $_REQUEST['mei_kana']))
                    {
                         echo 'カナ名は全角カナで入力してください。';
                    }
                    else if(!preg_match('<^[a-zA-Z0-9!#$%()*+-./:;=?@[]^_`{|}]{1,}$>', $_REQUEST['user']) || !preg_match('<^[a-zA-Z0-9!#$%()*+-./:;=?@[]^_`{|}]{1,}$>', $_REQUEST['password']))
                        {
                            echo 'ユーザー・パスワードは半角英数字記号で入力します。';
                        }
                        else if($_REQUEST['password'] !== $_REQUEST['password2'])
                            {
                                echo '2つのパスワードが一致してません。';
                            }
                            else if($sql->execute([htmlspecialchars($_REQUEST['sei'],$_REQUEST['mei'],$_REQUEST['sei_kana'],$_REQUEST['mei_kana'],$_REQUEST['user'],$_REQUEST['password'], ENT_QUOTES | ENT_HTML5, 'UTF-8')]))
                                {
                                    echo '更新に成功しました。';
                                }
                                    else {
                                            echo '更新に失敗しました。';
                                        }}
    catch(PDOException $e)
        {
            echo "次がエラーの内容です。;" .$e->getMessage();
        }
    ?>
    
```
CC BY-SA 4.0
2023-06-13T01:34:49.210
95197
2023-06-13T19:36:50.030
2023-06-13T01:37:36.850
3060
58703
question
php 正規表現
phpのpreg_matchが上手く効かない
[`preg_match`](https://www.php.net/manual/ja/function.preg-
match.php)のパターンが`<`で始まり`>`で終わっていることが原因のように思います。  
`<>`は`?P<name>`のような構文で[名前付きサブパターン](https://www.php.net/manual/ja/regexp.reference.subpatterns.php)として利用することが多いです。  
`/`で前後を囲むコードの誤字でしょうか？コードに意図がある場合は質問に追記してください。

**サンプルコード**

```

    <?php
    print(preg_match('/^[a-zA-Z0-9!#$%()*+-\.\/:;=?@\[\]^_`{|}]{1,}$/', 'azAZ09!#$%()=|-^`{+*}?_@[;:],./')); //"&<>'~\
    print(preg_match('/^[!-~]+$/', 'azAZ09!"#$%&\'()=~|-^`{+*}<>?_@[;:],.\\/'));
    ?>
    
```

サンプルコードの上段がパスワードチェック用の正規表現を書き直したものです。  
下段が英数字記号を1文字以上含む正規表現の例です。  
下段の例は上段で対象外となる記号の`"&<>'~\`を許容するのでご注意ください。

**参考資料**

  * [phpで文字列に「英数字記号」を含むかどうかチェックしたい](https://teratail.com/questions/102616)
CC BY-SA 4.0
2023-06-13T04:19:40.153
95199
2023-06-13T04:19:40.153
9820
95197
answer