【问题标题】:php preg_match subdomain checkup [duplicate]php preg_match子域检查[重复]
【发布时间】:2014-07-06 13:42:10
【问题描述】:

对于域名注册,我想添加一些验证,以防万一有人想发疯,输入一些奇怪的域名。

这就是我现在拥有的:

preg_match('/[^a-zA-Z0-9]/', $domain)

我还想添加“-”,但它不能是第一个或最后一个字符。 $domain 必须至少为 2 个或更多字符。并且不能以“-”开头或结尾。

RegEx Gurus:知道如何使这变得简单吗? 谢谢!

【问题讨论】:

  • 请记住,有些网址有下划线和其他您没有包含在上面的正则表达式中的字符
  • 老实说,您的正则表达式匹配应该比上面的要复杂一点...为了保持简单但更彻底,尝试匹配字符串 http 或 https,然后有效域名字符(在 www 和 .com 或 .whatever 之间),然后是 (\.com$|\.edu$) (等等)至少
  • 我只需要域名部分的正则表达式。我已经解决了 WWW 部分,以及 .com/.net/.org/ 等等......只需要名称本身的正则表达式。像 http(s)://www。 ONLY-NEED-REGEX-FOR-THIS-PART .com

标签: php regex


【解决方案1】:

^ 开始到$ 结束:至少+ 之一[a-z0-9] 后跟* 任意数量的(-[a-z0-9]+)

要使其也匹配 [A-Z],请添加 i (PCRE_CASELESS) modifier。要设置最小长度,可以在 ^ 处使用 lookahead 开始:(?=.{2}) 检查,如果前面至少有 2 个字符。

$pattern = '/^(?=.{2})[a-z0-9]+(?:-[a-z0-9]+)*$/i';

(?: 使用non-capturing group 进行重复。

test at regex101, regex faq

【讨论】:

    【解决方案2】:

    不考虑非英文字母,您可以使用此正则表达式进行简单验证以满足您的规则:

    preg_match('/^\w[\w-]*\w$/', $domain)
    

    这将:

    1. 需要 2 个或更多字符
    2. 将连字符但不作为\w 的第一个或最后一个字母与[a-zA-Z0-9_] 相同

    【讨论】:

    • 出了点问题。如果 $domain 包含两个字符并以“-”开头或结尾,则此方法有效,例如:如果 $domain 为“-a”,则有效。但它超过两个字符并以“-”开头,它不起作用。它允许注册“-abc”。
    • 对不起,我忘记了锚点,现在检查答案并检查这​​个演示:regex101.com/r/xQ1mO5
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2013-11-29
    • 2020-10-16
    相关资源
    最近更新 更多