1

私は正規表現が初めてで、正規表現を使用してフォーム検証を行っていました。しかし、問題は正規表現のほとんどが似ていることです

^(?=.{8})(?=.*[A-Z])(?=.*[a-z])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%#a-zA-Z\d]+$

これは、パスワードの検証に使用しています。他のフォーム検証については、ここでそのような表現をたくさん見つけました。問題は、次のようにコードでそれらを使用する場合です

if(preg_match('^(?=.{8})(?=.*[A-Z])(?=.*[a-z])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%@#a-zA-Z\d]+$', $password))

少なくとも 1 つのエラーが発生します。ほとんどの場合、エラーが表示されます 終了区切り文字がない、または不明な修飾子など

4

3 に答える 3

2

式の前後に区切り文字がありません。

これを試して:

$pattern = '/^(?=.{8})(?=.*[A-Z])(?=.*[a-z])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%#a-zA-Z\d]+$/';
preg_match ($pattern, $password);
于 2012-12-06T20:55:52.230 に答える
1

直接的な答え: 式に区切り文字がありません。PCRE は、最初の文字を区切り文字と見なして取得し、正規表現の末尾に終了^文字が見つからないため、エラーをスローします。^

間接的な答え: Andy-Lester がコメントしたように、あなたの正規表現は複雑すぎて、正規表現の第一人者ではない人にはほとんど読めません。私は、より読みやすく、より保守しやすい以下を使用します。

$req_regex = array(
    '/[A-Z]/',      //uppercase
    '/[a-z]/',      //lowercase
    '/[^A-Za-z]/'   //non-alpha
);

foreach($req_regex as $regex) {
    if( !preg_match($regex, $password) ) {
        return NULL;
    }
}
于 2012-12-06T21:44:13.463 に答える
0

あなたが与えた式の問題は、式の周りに区切り文字がないことです。

複雑な正規表現の場合は、断片的に構築するのが最善です。Firefox のアドオン (https://addons.mozilla.org/en-us/firefox/addon/rext/) が役立つことがわかりました。

于 2012-12-06T20:58:41.510 に答える