【问题标题】:preg_match to validate a URL slugpreg_match 验证 URL slug
【发布时间】:2012-02-09 03:20:44
【问题描述】:

我让用户在我的网站上创建他们自己的个人资料,这样他们就可以选择他们的网址。例如,如果他们的名字是 John Smith,他们可能想输入 john-smith,然后他们的个人资料 URL 将是 www.mysite.com/john-smith。

我需要使用 preg_match 来验证他们输入的是有效的 URL slug。所以这里是它必须满足的规则才能有效:

必须至少包含一个字母,并且只能包含字母、数字和连字符

有人可以帮帮我吗?我擅长 PHP,但正则表达式很垃圾!

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    更好的解决方案:

    function is_slug($str) {
        return preg_match('/^[a-z0-9]+(-?[a-z0-9]+)*$/i', $str);
    }
    

    测试:

    • 失败:-用户名
    • 失败:用户名
    • 失败:用户名-
    • 有效:用户名
    • 有效:user123-name-321
    • 有效:用户名
    • 有效:USER123 名称
    • 有效:用户名-2

    享受吧!

    【讨论】:

    • 有问题,与user-name不匹配,仅u-name regex101.com/r/0hYjoV/1
    • @ArthurShlain 谢谢。已修复,请重试。
    • 现在更好,但检查这个变体:user-name-2
    • @ArthurShlain 再次修复 =)
    • 如何也允许下划线?需要应用与破折号相同的规则,不能出现在开始/结束,但可以出现在中间。
    【解决方案2】:

    我希望这段代码是不言自明的:

    <?php
    
    function test_username($username){
        if(preg_match('/^[a-z][-a-z0-9]*$/', $username)){
            echo "$username matches!\n";
        } else {
            echo "$username does not match!\n";
        }
    }
    
    test_username("user-n4me");
    test_username("user+inv@lid")
    

    但如果不是,则函数 test_username() 会根据模式测试其参数:

    • 开始 (^) ...
    • 一封信 ([a-z]) ...
    • 后跟任意数量的字母、数字或连字符 ([-a-z0-9]*) ...
    • 之后就什么都没有了 ($)。

    【讨论】:

    • invalid--slug 失败
    • @Victor,你可以试试:/^[a-z](-[a-z0-9]+)*$/
    • @ArthurRonconi 这个效果更好:/^[a-z]+(-[a-z0-9]+)*$/
    【解决方案3】:

    很简单,如果我们假设第一个字符必须是字母...

    /[a-z]{1}[a-z0-9\-]*/i
    

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2022-12-14
      • 2010-10-30
      • 2014-12-19
      相关资源
      最近更新 更多