wes*_*bos 6 php regex preg-match
正则表达式让我大吃一惊.如何更改此选项以验证带加号的电子邮件?所以我可以用test+spam@gmail.com注册
if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['em'])) {
Run Code Online (Sandbox Code Playgroud)
Dan*_*uis 34
看起来你并不熟悉你的正则表达式当前正在做什么,这在修改它之前是一个很好的第一步.让我们使用电子邮件地址遍历您的正则表达式john.robert.smith@mail.com(在下面的每个部分中,粗体部分是该部分匹配的内容):
^是字符串锚点的开始.它指定任何匹配必须从字符串的开头开始.如果模式未锚定,则正则表达式引擎可以匹配子字符串,这通常是不期望的.
锚点为零宽度,这意味着它们不会捕获任何字符.
[_a-z0-9-]+由两个元素组成,一个字符类
和一个重复修饰符:
[...]定义一个字符类,它告诉正则表达式引擎,
这些字符中的任何一个都是有效匹配.在这种情况下,类包含字符az,数字0-9以及短划线和下划线(通常,字符类中的短划线定义范围,因此您可以使用
a-z而不是
abcdefghijklmnopqrstuvwxyz;当作为类中的最后一个字符给出时,它充当文字冲刺).+是一个重复修饰符,指定前面的标记(在这种情况下,字符类)可以重复一次或多次.还有另外两个重复运算符:*匹配零次或多次; ?恰好匹配零次或一次(即使某些东西
可选).(捕获 约翰 .robert.smith @ mail.com)
(\.[_a-z0-9-]+)*再次包含重复的字符类.它还包含一个
组和一个转义字符:
(...)定义一个组,允许您将多个标记组合在一起(在这种情况下,该组将作为一个整体重复).abc*,则重复修饰符仅适用于c,因为c是修饰符之前的最后一个标记.为了解决这个问题,我们可以对abc((abc)*)进行分组,在这种情况下,修饰符将应用于整个组,就像它是单个标记一样.\.指定文字点字符.这是需要的原因是因为.正则表达式中的特殊字符,意味着任何字符.由于我们想匹配一个实际的点字符,我们需要逃避它.(捕获约翰.robert.smith @ mail.com)
@在正则表达式中不是特殊字符,因此,与所有其他非特殊字符一样,它在字面上匹配.
(捕获john.robert.smith @ mail.com)
[a-z0-9-]+再次定义一个重复的字符类,如上面的第2项.
(捕获john.robert.smith @ mail .com)
(\.[a-z0-9-]+)*与上面的#3几乎完全相同.
(捕获john.robert.smith@mail .com)
$是字符串锚的结束.它与^上面的工作方式相同,只是匹配字符串的结尾.
考虑到这一点,如何添加捕获加段的部分应该更清楚一点.如上所述,+是一个特殊的角色,因此必须进行转义.然后,由于+必须跟随一些字符,我们可以定义一个包含我们想要匹配的字符的字符类并定义它的重复.最后,我们应该将整个组设置为可选,因为电子邮件地址不需要具有+段:
(\+[a-z0-9-]+)?
Run Code Online (Sandbox Code Playgroud)
当插入你的正则表达式时,它看起来像这样:
/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$/i
Run Code Online (Sandbox Code Playgroud)