【问题标题】:Regular Expression Macros正则表达式宏
【发布时间】:2014-04-18 19:15:42
【问题描述】:

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

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

但我似乎找不到任何类似的文档。是否有类似的有效编程语法,还是我记错了一些 RFC 样式的伪代码?

注意事项:

  • 我不是要验证电子邮件地址,我知道 filter_var()FILTER_VALIDATE_EMAIL
  • 我添加了 perl 标签,因为在我的旅行中有人说“我认为 perl 有类似的东西”

【问题讨论】:

  • my $email = qr/$localpart\@$domainpart/;
  • 我想你可能会觉得这个answer很有趣。
  • 您应该在问题中明确指出您正在寻找 PHP 解决方案,否则您很可能会从浏览 perl 标签的人那里得到 Perl 答案。
  • @Sammitch 我链接的答案是 PCRE 解决方案。请注意PCRE != perl regex。由于 PHP 使用 PCRE,它应该是您正在寻找的。顺便说一句,我也希望它可以在 perl 上运行,但不确定。
  • 删除了“perl”标签

标签: php regex pcre


【解决方案1】:

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

/
    (?(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 &lt;thomas@gmail.com&gt;

编辑:我还发现了一种更独立于实现的语法,可以使用:https://stackoverflow.com/a/22871592/1064767

【讨论】:

    【解决方案2】:

    在 perl 中,许多 perl 风格的正则表达式解决方案 /x 意味着忽略空格,并使用 cmets(示例从 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/; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2019-06-17
      • 2019-05-11
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多