PHP 中的 [\w\-] 正则表达式的含义是什么?

8
我试图理解以下链接中关于验证电子邮件的内容 - http://www.w3schools.com/PHP/php_form_url_email.asp 我知道\w意味着字母数字字符,即[0-9a-zA-Z],而-应该表示包括“ - ”。我感到困惑的是,在“。”之后他们也使用了它,我认为在“。”之后只能出现字母数字字符,例如“com”,“org”等。

是的,W3Schools是一个糟糕的资源,那个正则表达式也是错误的。它甚至无法匹配常见的a+b@example.com这是一个有效的电子邮件地址定义方式。 - Ry-
@minitech 我同意 OP 链接中的正则表达式很糟糕,但你的链接也不是很有帮助。 - CrayonViolent
这将是我用来验证电子邮件地址的库。 - abc123
1
我想说的是,最近的RFC 6531(http://tools.ietf.org/html/rfc6531#page-7)允许使用Unicode字符。我认为最好的做法是发送一封电子邮件并等待回复。否则,您就不知道该电子邮件是否有效。 - attila
@CrayonViolent:这并不是真正的意图。而这个链接可能更符合你的需求:https://php.net/manual/zh/filter.filters.validate.php - Ry-
2个回答

11

正则表达式 101

\w 解释

\w match any word character [a-zA-Z0-9_]

\w\- 解释

\w\-
    \w match any word character [a-zA-Z0-9_]
    \- matches the character - literally

匹配电子邮件地址 简单,不具备未来性

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b

2
FYI,这个电子邮件正则表达式将不能与许多已经出现和即将出现的新顶级域名相匹配。例如:me@mysite.solutions - CrayonViolent
@CrayonViolent 完全同意,我不想展示复杂的正则表达式。我更喜欢展示简单的答案,并让 OP 知道还有更复杂的答案存在。 - abc123

4

\w 表示 [a-zA-Z0-9_]

\- 在字符类中表示字面上的-

因此,[\w\-] 表示 [a-zA-Z0-9-]

请注意,在字符类中转义 - 如果它位于第一个或最后一个位置,则无用。


我没有给它点踩,但也许那个踩的原因是\w在任何支持Unicode的语言中(我相信PHP是支持的)也会匹配其他字符集中的许多字符。所以如果你只想匹配[a-zA-Z0-9_],而不是其他的,那么你应该这样写。 - Ron Rosenfeld
有人可能会给你点踩,因为你没有回答第二段中的问题,尽管……楼主似乎理解了你所回答的内容。 - Ry-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接