preg_match以验证URL段塞


preg_match to validate a URL slug

我允许用户在我的网站上创建自己的个人资料,这样他们就可以选择自己的url。例如,如果他们的名字是John Smith,他们可能想输入John Smith,那么他们的个人资料url将是www.mysite.com/John-Smith。

我需要使用preg_match来验证他们输入的是有效的URL段塞。因此,以下是它必须遵守的有效规则:

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

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

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

<?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]*
  • 并且在那之后什么都没有($

更好的解决方案:

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

测试:

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

享受吧!

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

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