PHP正则表达式基础知识

时间:2011-05-02 21:31:09

标签: php regex

我是编码和PHP的新手,我很难理解如何读取正则表达式。

例如,我构建了下面的简单正则表达式,这是一种验证电子邮件地址的弱尝试。

电子邮件地址 - test@test.com

正则表达式 - ^([0-9a-zA-Z])+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$

我想了解的是,如何处理和阅读此示例中的每个电子邮件地址段,例如

  1. 测试将被视为第1段,
  2. @将被视为第二段,
  3. periond(。)将被视为第三段,
  4. 显然,如果我在等式中引入一个额外的段,例如test-123正则表达式失败。

3 个答案:

答案 0 :(得分:4)

基础是

^([0-9a-zA-Z])+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$

^匹配字符串的开头 ()匹配您可以提取和使用的段,如果您使用preg_match例如

([0-9a-zA-Z])+表示它将匹配仅指定的那些字符中的一个或多个 对于电子邮件地址,还有其他有效的字符,如果您想了解详细信息,则应阅读电子邮件RFC http://tools.ietf.org/html/rfc5322

还有其他方法可以做到这一点,例如,如果在模式的末尾使用了/ i修饰符,则可以使其不区分大小写,然后您不需要同时指定a-z和A-Z

/^([0-9a-z])+@([-0-9a-z]+[.])+[a-z]{2,6}$/i

@符号非常明显,是电子邮件地址的必要部分(在外部系统中,内部电子邮件并不总是需要@,因为它可以默认为内部域名)

([ - 0-9A-ZA-Z] + [。])+ 这部分匹配域的主要部分,我注意到你已经包含了连字符 - 这次是在charset中。我也在想你应该拥有\。而不仅仅是。作为自己。匹配任何东西,而不是像你期望的那样完全停止。

所以它会匹配这些字符中的一个或多个[-0-9a-zA-Z],然后是任何字符

[A-ZA-Z] {2,6-} 匹配[a-zA-Z],最小长度为2,最大长度为6

$匹配然后字符串结束 如果您在电子邮件地址结尾后有空格,则验证失败,因此在这种情况下您需要先修剪它

匹配电子邮件地址实际上并不容易,因为有很多变体都是有效的

例如,这些都可以是有效的电子邮件地址 bumperbox bumperbox@invalid.com bumper-box@invalid.com bumperbox@invalid.co.uk bumper.box@subdomain.invalid.school.nz

您最好的选择是使用网络上已有的一种已建立的电子邮件验证模式,在preg_match下的php手册中有一些关于电子邮件验证的讨论,等等

如果你有最近的(5.2+)版本的php,你也可以使用filter_var等函数 http://nz.php.net/manual/en/function.filter-var.php

答案 1 :(得分:0)

test-123@test.com会失败,因为您的正则表达式中没有-电子邮件的该组件。它可能看起来没有,但确实没有。当你在正则表达式中[a-z]时,它实际上相当于说出[abcdefghijklmnopqrstuvwxyz],并且看到了-

如果您想在电子邮件地址的第一部分中添加短划线,则需要:

`[a-zA-Z0-9\-]`

注意反斜杠(\),ESCAPES破折号使其失去元字符状态(又名“特殊”)并变成与其他任何角色一样的字符。

答案 2 :(得分:0)

正则表达式没有“段”。引擎通过字符串试图找到匹配的字符序列。您在此处对“细分”的看法是在您的脑海中创建的,因为@(以及最终捕获中缺少.)充当锚点,为任何匹配输入的某些部分设置某些标准。

使用regexpal.com查看如何找到匹配项。