使用preg_match验证URL slug是否有效

7
我将让用户在我的网站上创建自己的个人资料,以便他们可以选择自己的网址。例如,如果他们的名字是John Smith,他们可能会输入john-smith,那么他们的个人资料网址将是www.mysite.com/john-smith。
我需要使用preg_match来验证他们输入的内容是否为有效的URL slug。因此,它必须满足以下规则才能被视为有效:
- 它必须至少包含一个字母,并且只能包含字母、数字和连字符。
请有经验的人帮助我一下,我擅长PHP但对正则表达式很蒻!
3个回答

15

我希望这段代码可以自我解释:

<?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]*) ...
  • 并且在此之后不能有任何东西 ($).

1
这对于 invalid--slug 失败了。 - Victor
@Victor,你可以尝试:/^a-z*$/ - Arthur Ronconi
@ArthurRonconi 这个更好用: /^[a-z]+(-[a-z0-9]+)*$/ - lokiloq

6
更好的解决方案:
function is_slug($str) {
    return preg_match('/^[a-z0-9]+(-?[a-z0-9]+)*$/i', $str);
}

测试:

  • 失败:-user-name
  • 失败:user--name
  • 失败:username-
  • 有效:user-name
  • 有效:user123-name-321
  • 有效:username
  • 有效:USER123-name
  • 有效:user-name-2

享受吧!


有些问题,与“user-name”不匹配,只能使用“u-name”。https://regex101.com/r/0hYjoV/1 - Arthur Shlain
@ArthurShlain 谢谢。已经修复,请再试一下。 - Arthur Ronconi
现在更好了,但请检查这个变量:user-name-2。 - Arthur Shlain
@ArthurShlain 又修好了 =) - Arthur Ronconi
如何允许下划线?与破折号相同的规则需要应用,不能出现在开头/结尾,但可以出现在中间。 - Vicky Dev
@VickyDev /^[a-z0-9]+([-_]?[a-z0-9]+)*$/i - Arthur Ronconi

1
相当简单,如果我们假设第一个字符必须是字母…
/[a-z]{1}[a-z0-9\-]*/i

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接