2011-03-31 157 views
4

正則表達式正在讓我迷失。我怎樣才能改變這一點來驗證帶有加號的電子郵件?所以我可以在申請時[email protected]允許+在正則表達式電子郵件中驗證電子郵件

if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['em'])) { 
+0

該正則表達式對電子郵件地址的工作。你試過了嗎? – Jeff 2011-03-31 16:38:24

+0

可能重複的[如何驗證電子郵件在PHP?](http://stackoverflow.com/questions/5855811/how-to-validate-an-email-in-php) – kapa 2014-06-10 22:20:43

回答

25

看起來你並不是真正熟悉你的正則表達式正在做什麼,這將是修改它之前的一個好的第一步。讓我們通過你的正則表達式使用的電子郵件地址[email protected](以下每個部分,粗體的部分就是由部分匹配)走:

  1. ^start of string anchor。 它指定任何匹配必須 開始在 字符串的開頭。如果錨圖案不是 ,那麼正則表達式引擎可以匹配 子字符串,這通常是不期望的 。

    錨點是零寬度,這意味着它們不會捕獲任何字符。

  2. [_a-z0-9-]+由兩個 元件,一個character classrepetition modifer

    • [...]定義一個字符類,它告訴正則表達式引擎, 這些字符任何有效匹配。在這種情況下,類 包含字符az,數字 0-9和破折號和下劃線(在 一般,在字符類 破折號限定一個範圍,因此可以使用的 a-z代替 abcdefghijklmnopqrstuvwxyz;當 作爲 類中的最後一個字符給出,它充當字面破折號)。
    • +是一個重複修飾符,它指定可以重複一次或多次前面的令牌 (在此例中爲字符類) 。 還有兩個其他重複 經營者:*匹配零或更多 次; ?完全匹配零或 一次(即,使得東西 可選)。

    (捕捉 約翰 .robert.smith @ mail.com)

  3. (\.[_a-z0-9-]+)*又包含 重複字符類。它還 包含 group, 和轉義字符:

    • (...)定義的基團,它允許用戶將多個令牌 在一起(在此情況下,組 將重複爲 整體) 。
      假設我們想要 匹配'abc',零次或多次(即 abcabcabc匹配,abcccc不匹配)。 如果我們試圖使用 abc*模式,則重複修改器 只適用於c,因爲 c是 修飾符之前的最後一個令牌。爲了避開 這個,我們可以將abc((abc)*), 分組,在這種情況下,修飾符 適用於整個組,就好像它是 是單個標記一樣。
    • \.指定了一個文字點字符。這是需要的原因 是因爲.是正則表達式中的一個特殊的 字符,意思是any character。 既然我們想匹配一個實際的點 字符,我們需要逃避它。

    (捕獲 約翰.robert.smith @ mail.com)

  4. @不 正則表達式特殊字符,所以,像所有其他 非特殊字符,它匹配 從字面上。
    (捕獲john.robert.smith @ mail.com)

  5. [a-z0-9-]+再次限定了重複字符類,像上述項目#2。
    (捕獲john.robert.smith @郵件 .COM)

  6. (\.[a-z0-9-]+)*幾乎完全相同的圖案與上述#3。
    (捕獲[email protected] .COM

  7. $是串錨固件的端部。它與上面的^的工作方式相同,只是匹配字符串的末尾。


考慮到這一點,它應該是更清楚一點如何添加欄目,捕捉一個加號段。正如我們上面看到的,+是一個特殊字符,所以它必須被轉義。然後,由於+必須跟隨一些字符,我們可以用我們想要匹配的字符來定義一個字符類並定義它的重複。最後,我們應該讓全組可選的,因爲電子郵件地址並不需要有一個+段:

(\+[a-z0-9-]+)? 

當插入您的正則表達式,它會是這樣的:

/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)[email protected][a-z0-9-]+(\.[a-z0-9-]+)*$/i 
+0

那麼保持\ \。以及?不應該在[] – wesbos 2011-03-31 16:45:50

+0

@Wes中表達什麼意思? – 2011-03-31 16:47:06

+0

我當前的正則表達式顯示(\。[_ a-z0-9 - ] +),我是否有它(\ + \。[_ a-z0-9 - ] +? – wesbos 2011-03-31 16:48:45

2

我用this regex驗證郵件,它工作得很好用電子郵件,包含+

/^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ 
+0

這似乎不錯,但它允許其他字符這不是假設在電子郵件地址。 – 2017-03-05 13:21:22

+0

@RickSanchez可悲的現實是,正則表達式並不是解析/驗證電子郵件地址的正確工具。 – 2017-03-07 15:39:06

6

保存理智。獲取預製的PHP RFC 822Email address parser

+2

如果我能給你十+ 1我會。 – CanSpice 2011-03-31 16:39:44

+0

這是JavaScript的RFC 822 http://badsyntax.co/post/javascript-email-validation-rfc822 – Gavin 2016-01-29 03:31:18

1

\+將匹配文字+符號,但請注意:根據RFC規範,您仍然不會匹配所有可能的電子郵件地址,因爲the actual regex for that is madness。這幾乎肯定不值得;你應該使用真正的電子郵件解析器。

0

這是另一種解決方案(類似於大衛找到了解決方法):

//Escaped for .Net 
^[_a-zA-Z0-9-]+((\\.[_a-zA-Z0-9-]+)*|(\\+[_a-zA-Z0-9-]+)*)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*(\\.[a-zA-Z]{2,4})$ 

//Native 
^[_a-zA-Z0-9-]+((\.[_a-zA-Z0-9-]+)*|(\+[_a-zA-Z0-9-]+)*)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4})$ 
相關問題