-1

希望するメールアドレスのローカルコンポーネントのみを受け入れる必要がある登録フォームを作成しています。ドメインコンポーネントはサイトに固定されています。validators.validate_emailDjangoが提供するものを選択的にコピーして検証しようとしていますEmailField

email_re = re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
    # quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"'
    r')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$)'  # domain
    r'|\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]$', re.IGNORECASE)  # literal form, ipv4 address (SMTP 4.1.3)
validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')

以下は私のコードです。私の主な問題は、正規表現を適応させることができないということです。この時点では、http: //www.pythonregex.com/の正規表現テスターでのみテストしていますが、失敗しています。

^([-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*)$

これは、次のような望ましくない文字を渡しているようです?

私のフィールドのコード全体は、この段階では必ずしも関連性がありませんが、コメントを気にしないでください。

class LocalEmailField(CharField):    
    email_local_re = re.compile(r"^([-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*)$", re.IGNORECASE)
    validate_email_local = RegexValidator(email_re, (u'Enter a valid e-mail username.'), 'invalid')
    default_validators = [validate_email_local]

編集:明確にするために、ユーザーはの前にテキストを入力しているだけ@なので、バリデーターでを検証する必要がないのはなぜ@domain.comですか。

編集2:したがって、フォームフィールドとラベルは次のようになります。

希望のメールアドレス:[--- type-able area ---] @ domain.com

4

4 に答える 4

2

「 などの好ましくない文字」とおっしゃっ?ていますが、どの文字が好ましいかは間違っていると思います。元の正規表現では疑問符を使用できます。

大規模な正規表現を使用しない独自のバリデーターを定義することもでき、後でロジックをデコードする可能性があることに注意してください。

于 2012-09-10T05:06:20.480 に答える
1

問題に直面したときに、「わかっている、正規表現を使用する」と考える人もいます。今、彼らは2つの問題を抱えています。-ジェイミー・ザウィンスキー

正規表現を介したチェックは、時間を無駄にする練習です。最善の方法は、配信を試みることです。このようにして、メールアドレスを確認できるだけでなく、メールボックスが実際にアクティブでメールを受信できるかどうかも確認できます。

そうしないと、すべてのルールに一致することを期待できない、拡張する正規表現になってしまいます。

"Haha boo hoo woo woo!"@foo.comは有効なアドレスなので、qwerterukeriouo@gmail.com

代わりに、ほぼ標準的な「blahblah@goo.comに送信した電子メールのリンクをクリックしてアドレスを確認してください」を提供します。アプローチ。

電子メールアドレスを作成する場合は、電子メールコンポーネントの一部にすることができるものについて独自のルールを作成できます。そしてそれらはRFCで公式に許可された文字のサブセットである可能性があります。

たとえば、保守的なルール(正規表現を使用しない):

allowed_chars = [string.digits+string.letters+'-']

if len([x in user_input if x not in allowed_chars]):
   print 'Sorry, invalid characters'
else:
   if user_input[0] in string.digits+'-':
      print 'Cannot start with a number or `-`'
   else:
      if check_if_already_exists(user_input):
         print 'Sorry, already taken'
      else:
         print 'Congratulations!'

      
于 2012-09-10T05:04:30.840 に答える
1

私はまだDjangoとPythonに慣れていませんが、なぜ車輪の再発明を行い、独自の正規表現を維持するのですか?ユーザーにメールアドレスのローカル部分のみを入力してもらいたい場合は別として、Djangoの組み込みに満足している場合はEmailField、それを非常に簡単にサブクラス化して、検証ロジックを少し調整できます。

DOMAIN_NAME = u'foo.com'


class LocalEmailField(models.EmailField):
    def clean(local_part):
        whole_address = '%s@%s' % (local_part, DOMAIN_NAME)
        clean_address = super(LocalEmailField, self).clean(whole_address)
        # Can do more checking here if necessary
        clean_local, at_sign, clean_domain = clean_address.rpartition('@')
        return clean_local

フォームとフィールドの検証および.clean()メソッドのドキュメントを見ましたか?

于 2012-09-10T05:56:38.237 に答える
0

正規表現で100%正しく実行したい場合は、ネストされた括弧の一致を可能にする何らかの形式の拡張正規表現を備えたエンジンを使用する必要があります。

Pythonのデフォルトのエンジンではこれが許可されていないため、非常に単純な(許容的な)正規表現で妥協することをお勧めします。

于 2012-09-10T05:15:44.500 に答える