正则表达式宏

时间:2014-03-13 19:32:20

标签: php regex pcre

我试图建立一个复杂的正则表达式,我记得读过一篇关于电子邮件地址验证的文章,其中正则表达式的每个部分都被分解为更简单的单个正则表达式,如:

email      := <localpart>@<domainpart>
localpart  := (?:<mailbox>\+)?(<username>)
domainpart := <domainname>\.<tld>
etc...

但我似乎无法找到类似的任何文件。有没有类似的有效的,程序化的语法,还是我错误地记住了一些RFC风格的伪代码?

注意:

  • 我没有尝试验证电子邮件地址,我知道filter_var()FILTER_VALIDATE_EMAIL
  • 我已经添加了perl标签,因为在我的旅行中有人说&#34;我认为perl有类似的东西&#34;

2 个答案:

答案 0 :(得分:1)

我正在寻找的语法,正如@HamZa在评论中所建议的那样:

/
    (?(DEFINE)
        (?<userpart> thomas | richard | harold )
        (?<domainpart> gmail | yahoo | hotmail )
        (?<tld> com | net | co\.uk )
        (?<email> (?&userpart)@(?&domainpart)\.(?&tld) )
    )
    ^To:\s.*\s<(?&email)>$
/xi

其匹配的行如下:To: Mr. Selleck <thomas@gmail.com>

编辑:我还发现了一种可以使用的更多与实现无关的语法:https://stackoverflow.com/a/22871592/1064767

答案 1 :(得分:-1)

在perl中,许多perl样式的正则表达式解决方案/x意味着忽略空格,并有评论(样本从perl.com无耻地拉出

$_ =~ m/^                       # anchor at beginning of line
      The\ quick\ (\w+)\ fox    # fox adjective
      \ (\w+)\ over             # fox action verb
      \ the\ (\w+) dog          # dog adjective
      (?:                       # whitespace-trimmed comment:
        \s* \# \s*              #   whitespace and comment token
        (.*?)                   #   captured comment text; non-greedy!
        \s*                     #   any trailing whitespace
      )?                        # this is all optional
      $                         # end of line anchor
     /x;                        # allow whitespace

你也可以使用正则表达式的变量(取自perlop),包括多个变量,注意不要使用用户输入以免创建“正则表达式注入”。将正则表达式存储为字符串然后在正则表达式字符串中连接该字符串将适用于任何允许您将正则表达式存储为字符串的语言(我所知道的所有内容)

$rex = qr/my.STRING/is;
print $rex;                 # prints (?si-xm:my.STRING)
s/$rex/foo/;