2011-06-07 116 views
0

我正在使用正則表達式驗證電子郵件地址是我正在使用的正則表達式。

preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/", $email) 

最上面的代碼是自解釋的一樣

一個)^表示NOT。

b)該字符串的開頭應該是_ a-z 0-9

C)匹配以點

d開始下一個字符)現在什麼呢* @表示這裏,可能不是很公正@這意味着下一個字符應該是@

e)接下來它會嘗試找到點,第一個點是可選的,第二個點是強制性的。

f)到底什麼是$意味着什麼?

+2

在這種情況下'^'不代表「不」。它只在一個字符類內部進行(然後只有在它是第一個字符時):'[^ abc']'。這裏的意思是「字符串的開始」。 – 2011-06-07 05:56:33

+0

此外,該表達是錯誤的。它應該以'(\。[a-z] {2,})$ /'結尾。否則,您將忽略.areo,.coop,.info,.museum,.name,.local或.localdomain頂級域名或任何新出現的新通用頂級域名。 2011-06-07 06:03:04

+1

@Thomas ......這種模式遠不止於此。 – eyelidlessness 2011-06-07 06:17:25

回答

7

你假設一)是不是真的

^結束是開始在這種情況下的字符串。在一個字符類的開始它的一個NOT。

[_a-z0-9-]+將匹配任何字符的在[]一次或多次(因爲+

(\.[_a-z0-9-]+)*然後有一個點比以前相同的圖案和*意味着這個完整的部分可以重複0或多次

然後必須有字符@

然後將部件從@重複之前

F)見第錨:

(\.[a-z]{2,3})$字符串必須結束(由$定義)與.和2或3小寫字母

+0

在這種情況下,'^'可能是一行或字符串的開始。對於'^'(字符類外部)嚴格要求字符串的開始,必須使用's'修飾符('/ s'或'(?s)')。 – eyelidlessness 2011-06-07 05:59:38

+1

@eyelidlessness在這種情況下,它是字符串的開始。在字符類的開始處,它是一個「NOT」。 'm'(多行)修飾符改變了'^'的行爲,並且這個修飾符與行的開始相匹配。 's'(dotall)修飾符使'.'匹配新的行字符。 – stema 2011-06-07 06:08:40

+0

我站好了。我對''''''''''''''''''''''''''''''''''''''多行影響'感到困惑's'(dotall)感謝您的更正。 – eyelidlessness 2011-06-07 06:15:10

2

*表示前面的規則1次或多次

而$在這種情況下,意味着該字符串

(\.[_a-z0-9-]+)* // these characters can appear 0 or multiple times 

(\.[a-z]{2,3})$ // the string ends with 2 letters in lowercase alphabet 
1

由於現有的答案並不包括這...

是,*意味着「零次或多次」,但也是「貪婪」的d efault,所以它會匹配儘可能多的次數,即使匹配字符串的一部分會導致模式的下一部分匹配。通過附加?*?,可以使得「012」可以變成「懶惰」(允許模式「回溯」以允許模式中的進一步匹配)。

相關問題