質問: Laravelのバリデーションで制御文字をバリデーションしたいです。 以下の正規表現だと正常な入力でもregexで引っかかります。 ``` ``` ``` 'name' => ['required', 'string', 'max:10', 'regex:/\A[[:^cntrl:]]{1, 10}\z/u'], 'message' => ['required', 'string', 'max:300', 'regex:/\A[\r\n\t[:^cntrl:]]{1, 300}\z/u'], ``` コントローラでpreg_matchを使って検証しました。こちらも引っかかります。 hello と入力した場合 ``` dd($request->name); // "hello" dd($request->message); // "hello" preg_match('/\A[[:^cntrl:]]{1, 10}\z/u', $request->name) // 0 preg_match('/\A[\r\n\t[:^cntrl:]]{1, 300}\z/u', $request->message) // 0 ``` 制御文字を入力していないのにどうして引っかかるのでしょうか。 どうすれば制御文字を禁止できますか?
回答: ~~`^`の位置がおかしくありませんか?~~ ~~`[[:^cntrl:]]`ではなくて`[^[:cntrl:]]`では?(行頭にマッチしているように見えます)~~ この位置で正しいとのご指摘をいただきました。コメントをご参照ください。