gpt4 book ai didi

php - 这个正则表达式我做错了什么?

转载 作者:可可西里 更新时间:2023-11-01 00:09:52 26 4
gpt4 key购买 nike

老实说,我真的不懂 RegEx。所以我完全不知道我哪里出错了。

我正在寻找一个 接受字母数字字符的正则表达式(和下划线,用于用户名)。我在这里四处搜索,发现了很多我尝试过的 RegEx 示例,但没有一个有效。

除其他外,我主要从这里的答案中获得,我已经尝试过

^[a-zA-Z0-9_]*$
/[^a-z_\-0-9]/i
/^\w+$/

为了匹配这些,我尝试了(使用每个正则表达式)

   if(preg_match("/^\w+$/", $username)) { 
//don't accept
}

 if(!preg_match("/^\w+$/", $username)) {
//don't accept
}

if(preg_match("/^\w+$/", $username) == 1) {
//don't accept
}

if(preg_match("/^\w+$/", $username) == 0) {
//don't accept
}

等等...每一次它都接受特殊字符(我试过 &、$、^ 和 %)。

我到底做错了什么?它是正则表达式的格式吗?这是我要求它检查的方式吗?

此外,如果找到特殊字符,我得到的返回类型到底是什么? (即我不想想接受的)

最佳答案

preg_match如果输入字符串与您提供的模式匹配,则返回 1,否则返回 0。

您希望用户名中的每个字符都是字母数字(加上下划线)。一种 PCRE 表达方式是使用 character class在方括号内,例如:[A-Za-z0-9_]。有几种方法可以使用这个基本类来做你想做的事。

一种方法是“否定”搜索:尝试匹配一个字母数字字符,如果匹配,则测试失败。为此,我们只需在字符类的前面添加一个克拉。这意味着我们正在匹配该集合中的任何字符。

因此,以下模式匹配“任何非字母数字、非下划线字符”。在这里,匹配意味着无效用户名:

if (preg_match('/[^A-Za-z0-9_]/',  $username)) {
// invalid username
}

或者,您可以进行相反类型的匹配,为有效用户名提供模式并检查是否匹配。这一次,我们根本没有改变字符类本身,但我们在它后面添加了 + 量词,这意味着我们正在匹配一个或多个的“good” "字符。

此外,我们将 ^$ 字符串的开头和结尾 anchor 包裹在我们的模式周围。 (这有点令人困惑,但是模式开头的克拉与括号内字符类开头的克拉具有完全不同的含义)。

最终结果是一个模式,意思是:“1 个或多个字母数字字符(加上下划线),没有别的。”与此匹配意味着有效用户名:

if (preg_match('/^[A-Za-z0-9_]+$/', $username)) {
// valid username
}

关于php - 这个正则表达式我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com