4

正規表現を学んでいるので、気楽にどうぞ!

ユーザー名は、が(アンダースコア)で始まらない場合、および_単語文字(文字、数字、アンダースコア自体)のみが含まれている場合に有効と見なされます。

namespace Gremo\ExtraValidationBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class UsernameValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        // Violation if username starts with underscore
        if (preg_match('/^_', $value, $matches)) {
            $this->context->addViolation($constraint->message);
            return;
        }

        // Violation if username does not contain all word characters
        if (!preg_match('/^\w+$/', $value, $matches)) {
            $this->context->addViolation($constraint->message);
        }
    }
}

それらを1つの正規表現にマージするために、私は次のことを試しました。

^_+[^\w]+$

読み方:アンダースコアで始まる場合(最終的には複数)、および後続の文字が少なくとも1つ許可されていない場合(文字、数字、またはアンダースコアではない)、違反を追加します。たとえば、「_test」では機能しません。

私がどこが間違っているのか理解するのを手伝ってくれませんか?

4

4 に答える 4

5

2番目の正規表現に否定的な先読みアサーションを追加できます。

^(?!_)\w+$

つまり、文字列の一部ではなく、文字列全体を一致させるようにしてください。文字列はアンダースコアで始めてはならず、1つ以上の単語文字を含めることができます。

それが機能するのを見る

于 2012-09-14T17:56:25.267 に答える
1

問題はド・モルガンの法則です。^_+[^\w]+$1つ以上の下線で始まり、後続のすべての文字が単語以外の文字である場合にのみ一致 ます。アンダースコアで始まる場合、または 文字が単語以外の文字である場合は、一致させる必要があります。

この場合、有効なユーザー名に焦点を当てる方が簡単だと思います。アンダースコア以外の単語文字で始まり、残りのすべての文字は単語文字です。つまり、有効なユーザー名はパターンで記述されます^[^\W_]\w*$。だから、あなたは書くことができます:

if (! preg_match('/^[^\W_]\w*$/', $value, $matches)) {
于 2012-09-14T17:57:03.317 に答える
0

簡単な解決策は次のとおりです。

if (!preg_match('/^[a-zA-Z0-9]+$/', $value, $matches)) {

\wグループ(アンダースコアを含む)が必要でしたが、アンダースコアがないため、アンダースコア[a-zA-Z0-9]と同等ですが、アンダースコアはありませ\wん。

于 2012-09-14T17:59:12.090 に答える
0

もちろん、これを行うには多くの異なる方法があります。私はおそらく、の線に沿って何かと一緒に行くことを検討するでしょう/^(?!_)[\w\d_]+/$

[\w\d_]+アンカー(^および$)と組み合わされた部分は、基本的に、文字列全体がこれらの文字のみで構成されていることを表明します。(?!_)の部分は、否定的な先読みアサーションです。これは、次の文字がアンダースコアではないことを確認することを意味します。^アンカーのすぐ隣にあるため、最初の文字がアンダースコアにならないようにします。

于 2012-09-14T17:59:20.760 に答える