【问题标题】:Regex to validate domain name without top-level domain using preg_match正则表达式使用 preg_match 验证没有顶级域的域名
【发布时间】:2021-08-02 08:15:51
【问题描述】:

我从 PHP 开始,我正在为域名编写一个简短的过滤器,其中表单将只接受一个没有任何其他输入的域名,例如点、开头或结尾的连字符或特殊字符。

例子:

有效

域名
域名
域名
等等

无效

域名.com
域名..com
域名.de
domain.co.uk
-域名

到目前为止我的代码:

add_filter( 'gform_field_validation_6_1', 'custom_validation', 10, 4);
function custom_validation( $result, $value, $form, $field ) {
    $pattern = "(.de|.com|.cz)";
    //$pattern = "^(?!\-)(?:(?:[a-zA-Z\d][a-zA-Z\d\-]{0,61})?[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$";
    if ( preg_match ( $pattern, $value ) ) {
        $result['is_valid'] = false;
        $result['message'] = 'Please enter only valid domain name';
    } else {
        $result['is_valid'] = true;
        $result['message'] = '';
    }

    return $result; 
}

代码中的注释部分:
$pattern = "^(?!-)(?:(?:[a-zA-Z\d][a-zA-Z\d- ]{0,61})?[a-zA-Z\d].){1,126}(?!\d+) 是我在 SO 的其他地方找到的,但它验证了域名为 top级域,我不想要。

【问题讨论】:

  • 好吧,只是域名[\w-]+ 似乎就足够了。

标签: php regex


【解决方案1】:

URL safe regex ^[a-zA-Z0-9_-]*$ 你应该没问题

const regex = new RegExp('^[a-zA-Z0-9_-]*$');
const shouldBeValid = ['domain-name', 'domainname', 'domain'];
const shouldBeInvalid = ['domain-name.com', 'domainname.cz', 'domain.co.uk'];
shouldBeValid.forEach(item=>console.log(item, 'is', regex.test(item)));
shouldBeInvalid.forEach(item=>console.log(item, 'is', regex.test(item)));

这是javascript sn-p只是为了能够在页面上运行它。

【讨论】:

  • 感谢您的回答。不幸的是,这部分允许在开头和结尾使用连字符,所以我不得不稍微编辑一下:$pattern = "(\A[a-zA-Z0-9](?:[a-zA-Z0-9_-]*[a-zA-Z0-9])+\z)";
【解决方案2】:

问题的答案是将模式改为:

$pattern = "(\A[a-zA-Z0-9](?:[a-zA-Z0-9\d-]*[a-zA-Z0-9])+\z)";

不允许在域的开头或结尾使用连字符,不允许任何 TLD 和任何其他特殊字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多