【问题标题】:Matching portions of a regex匹配正则表达式的部分
【发布时间】:2017-11-29 18:50:37
【问题描述】:

当域的起始部分有效时,我正在尝试匹配重写规则,例如:

/asd-
/asd-f
/asd-f4.
/asd-f4.n
/asd-f4.n
/asd-f4.net

我不希望它在这些无效的起始域中匹配:

/-
/-as
/as--
/asdf.4

我知道它不完全包含,但我将有效域定义为:

  • 以字母或数字开头和结尾(不包括点和 tld 部分)
  • 1 个字符或更长且小于 63 个字符(不包括点和 tld 部分)
  • 仅包含字母、数字或连字符(不包括点和 tld 部分)
  • 连续不包含两个或多个连字符
  • 以 .com、.net 或 .org 结尾

现在我的正则表达式匹配有效域,但如果它只是以有效域名开头,我并没有真正得到。

RewriteRule ^/(((?!-)(?!.*--)[A-Za-z0-9-](?<!-)){1,63}(\.(com|net|org)))$ /?domain=$1 [NC]

【问题讨论】:

  • RewriteRule 只匹配REQUEST_URI 而不是域名。
  • 如果分解成一系列条件会简单很多。
  • 你应该澄清你在这个RewriteRule中想要做什么。

标签: regex mod-rewrite


【解决方案1】:

我不确定这是否是您需要的,但无论如何都会尝试。
请注意,正如我认为您所说的,最后一部分 \.(com|net|org) 是必需的。

如果 last 部分是 not 必需的,那么您必须使用
其他一些锚定,例如(\.(com|net|org)|(?!\S)) 或类似的。

/([a-zA-Z0-9]|(?&lt;!/)-(?!-)){1,63}\.(com|net|org)

展开

 /  
 (
      [a-zA-Z0-9] 
   |  (?<! / )
      -
      (?! - )
 ){1,63}
 \.
 ( com | net | org )

或者,您可以匹配一个进程,但它仍然需要一些
最后锚定(可以是任何东西)。

/([a-zA-Z0-9]|(?&lt;!/)-(?!-)){1,63}(\.(c(om?)?|n(et?)?|o(rg?)?)?)?(?!\S)

https://regex101.com/r/4bmeCT/1

展开

 /
 (
      [a-zA-Z0-9] 
   |  (?<! / )
      -
      (?! - )
 ){1,63}
 (
      \.
      (
           c
           ( om? )?
        |  n
           ( et? )?
        |  o
           ( rg? )?
      )?
 )?
 (?! \S )  # some anchoring required here

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2017-06-23
    • 2015-04-12
    • 2020-01-02
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多