正則表達式正在讓我迷失。我怎樣才能改變這一點來驗證帶有加號的電子郵件?所以我可以在申請時[email protected]允許+在正則表達式電子郵件中驗證電子郵件
if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['em'])) {
正則表達式正在讓我迷失。我怎樣才能改變這一點來驗證帶有加號的電子郵件?所以我可以在申請時[email protected]允許+在正則表達式電子郵件中驗證電子郵件
if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['em'])) {
看起來你並不是真正熟悉你的正則表達式正在做什麼,這將是修改它之前的一個好的第一步。讓我們通過你的正則表達式使用的電子郵件地址[email protected]
(以下每個部分,粗體的部分就是由部分匹配)走:
^
是start of string anchor。 它指定任何匹配必須 開始在 字符串的開頭。如果錨圖案不是 ,那麼正則表達式引擎可以匹配 子字符串,這通常是不期望的 。
錨點是零寬度,這意味着它們不會捕獲任何字符。
[_a-z0-9-]+
由兩個 元件,一個character class 和repetition modifer:
[...]
定義一個字符類,它告訴正則表達式引擎, 這些字符任何有效匹配。在這種情況下,類 包含字符az,數字 0-9和破折號和下劃線(在 一般,在字符類 破折號限定一個範圍,因此可以使用的 a-z
代替 abcdefghijklmnopqrstuvwxyz
;當 作爲 類中的最後一個字符給出,它充當字面破折號)。+
是一個重複修飾符,它指定可以重複一次或多次前面的令牌 (在此例中爲字符類) 。 還有兩個其他重複 經營者:*
匹配零或更多 次; ?
完全匹配零或 一次(即,使得東西 可選)。(捕捉 約翰 .robert.smith @ mail.com)
(\.[_a-z0-9-]+)*
又包含 重複字符類。它還 包含 group, 和轉義字符:
(...)
定義的基團,它允許用戶將多個令牌 在一起(在此情況下,組 將重複爲 整體) 。 abc*
模式,則重複修改器 只適用於c
,因爲 c是 修飾符之前的最後一個令牌。爲了避開 這個,我們可以將abc((abc)*
), 分組,在這種情況下,修飾符 適用於整個組,就好像它是 是單個標記一樣。\.
指定了一個文字點字符。這是需要的原因 是因爲.
是正則表達式中的一個特殊的 字符,意思是any character。 既然我們想匹配一個實際的點 字符,我們需要逃避它。(捕獲 約翰.robert.smith @ mail.com)
@
不 正則表達式特殊字符,所以,像所有其他 非特殊字符,它匹配 從字面上。
(捕獲john.robert.smith @ mail.com)
[a-z0-9-]+
再次限定了重複字符類,像上述項目#2。
(捕獲john.robert.smith @郵件 .COM)
(\.[a-z0-9-]+)*
幾乎完全相同的圖案與上述#3。
(捕獲[email protected] .COM)
$
是串錨固件的端部。它與上面的^
的工作方式相同,只是匹配字符串的末尾。
考慮到這一點,它應該是更清楚一點如何添加欄目,捕捉一個加號段。正如我們上面看到的,+
是一個特殊字符,所以它必須被轉義。然後,由於+必須跟隨一些字符,我們可以用我們想要匹配的字符來定義一個字符類並定義它的重複。最後,我們應該讓全組可選的,因爲電子郵件地址並不需要有一個+段:
(\+[a-z0-9-]+)?
當插入您的正則表達式,它會是這樣的:
/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)[email protected][a-z0-9-]+(\.[a-z0-9-]+)*$/i
我用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,}))$/
這似乎不錯,但它允許其他字符這不是假設在電子郵件地址。 – 2017-03-05 13:21:22
@RickSanchez可悲的現實是,正則表達式並不是解析/驗證電子郵件地址的正確工具。 – 2017-03-07 15:39:06
保存理智。獲取預製的PHP RFC 822Email address parser
\+
將匹配文字+符號,但請注意:根據RFC規範,您仍然不會匹配所有可能的電子郵件地址,因爲the actual regex for that is madness。這幾乎肯定不值得;你應該使用真正的電子郵件解析器。
這是另一種解決方案(類似於大衛找到了解決方法):
//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})$
該正則表達式對電子郵件地址的工作。你試過了嗎? – Jeff 2011-03-31 16:38:24
可能重複的[如何驗證電子郵件在PHP?](http://stackoverflow.com/questions/5855811/how-to-validate-an-email-in-php) – kapa 2014-06-10 22:20:43