Php 这个正则表达式我做错了什么?
老实说,我真的不懂正则表达式。所以我完全不知道我在哪里出了错 我正在寻找一个只接受字母数字字符的正则表达式(加下划线表示用户名)。我在这里搜索了很多我尝试过的示例正则表达式,但没有一个有效 在其他方面,我主要是从这里的答案中得到的,我已经尝试过了Php 这个正则表达式我做错了什么?,php,regex,Php,Regex,老实说,我真的不懂正则表达式。所以我完全不知道我在哪里出了错 我正在寻找一个只接受字母数字字符的正则表达式(加下划线表示用户名)。我在这里搜索了很多我尝试过的示例正则表达式,但没有一个有效 在其他方面,我主要是从这里的答案中得到的,我已经尝试过了 ^[a-zA-Z0-9_]*$ /[^a-z_\-0-9]/i /^\w+$/ 为了匹配这些,我尝试了(使用每个正则表达式) 及 及 及 等等。。。 每次它接受特殊字符时(我尝试了&、$、^和%) 我到底做错了什么?它是正则表达式的格式吗?这是我要求
^[a-zA-Z0-9_]*$
/[^a-z_\-0-9]/i
/^\w+$/
为了匹配这些,我尝试了(使用每个正则表达式)
及
及
及
等等。。。
每次它接受特殊字符时(我尝试了&、$、^和%)
我到底做错了什么?它是正则表达式的格式吗?这是我要求它检查的方式吗
另外,如果发现特殊字符,我得到的返回类型是什么?(即我不想接受的)
使用严格相等运算符(==)意味着我们要比较preg_match()返回的值是1,即数字,而不是布尔值。如果它返回0,则表示没有匹配项、布尔值为false、错误为occored。查看preg\u match
页面了解更多信息:Per*preg\u match*如果无法找到与正则表达式的成功匹配,将返回0;如果出现错误,将返回FALSE。因此,如果要确保测试的是0,而不是可能计算为false的内容,则应使用=
运算符
如果您只需要字母和下划线,则可以使用[a-z_]
字符类,该类指定a到z的字符范围与
符号匹配。类后面的+
指定您想要一个或多个相同的。^
表示模式必须从文本开始匹配,而$
表示模式必须匹配到文本结束
if (preg_match("/^[a-z_]+$/i", $text_variable) === 1) {
//"A match was found.";
} else {
//"A match was not found.";
}
如果输入字符串与您给定的模式匹配,则返回1,如果不匹配,则返回0
您希望用户名中的每个字符都是字母数字(加下划线)。一种PCRE的表达方式是用一个内方括号,如下图所示:[a-Za-z0-9.]
。有几种方法可以使用这个基本类来实现您想要的功能
一种方法是“否定”搜索:尝试匹配非字母数字字符,如果匹配,则测试失败。为此,我们只需在character类的前面添加一克拉。这意味着我们正在匹配不在该集中的任何字符
因此,以下模式匹配“任何非字母数字、非下划线字符”。这里,匹配表示无效用户名:
if (preg_match('/[^A-Za-z0-9_]/', $username)) {
// invalid username
}
if (preg_match('/^[A-Za-z0-9_]+$/', $username)) {
// valid username
}
或者,您可以进行相反类型的匹配,即为有效用户名提供一个模式,并检查是否匹配该模式。这一次,我们根本不改变字符类本身,而是在它后面添加了+
量词,这意味着我们匹配了一个或多个“好”字符
此外,我们将^
和$
字符串的开头和结尾锚定围绕我们的模式。(这有点令人困惑,但模式开头的克拉与括号内字符类开头的克拉的含义完全不同)
最终结果是一个模式,表示“1个或多个字母数字字符(加下划线)而不是其他字符。”此模式上的匹配表示有效用户名:
if (preg_match('/[^A-Za-z0-9_]/', $username)) {
// invalid username
}
if (preg_match('/^[A-Za-z0-9_]+$/', $username)) {
// valid username
}
如果掌握了基本知识,正则表达式很容易理解:) 我将尝试向您解释您尝试过的三种表达方式:
^ // from the beginning...
[a-zA-Z0-9_] // contains only characters a-z or A-Z or 0-9 or _ sign
* // and has 0 or more of such characters
$ // to the end
[^a-z_\-0-9]
// ^ means "the opposite" so that subset describes characters
// which are not included in it
// (are not a-z or _ sign, or - dash sign, or 0-9 numbers)
i modifier
// stands for case insensitive, all letters are treated as lowercase
^ // from the beginning
\w // contains only characters a-z or A-Z or 0-9 or _ sign
+ // and the string must be at least 1 character long
$ // to the end
匹配字符串,例如:
(empty string - since you told 0 or more characters)
abc09
fidjwieofoj4fio3j4fiojrfioj3ijfo
000000000000000000000
__________
and_many_many_more_as_long_as_they_contain_alpha_characters_and___sign
!
a>a
A<9
ffffffffff.dflskfdfd
00000,
]]]]]]]]]]]]]]]]]]
and so-on
mike
alice
bob10
0000000000
1111
9
php
user_example
^ // from the beginning...
[a-zA-Z0-9_] // contains only characters a-z or A-Z or 0-9 or _ sign
* // and has 0 or more of such characters
$ // to the end
[^a-z_\-0-9]
// ^ means "the opposite" so that subset describes characters
// which are not included in it
// (are not a-z or _ sign, or - dash sign, or 0-9 numbers)
i modifier
// stands for case insensitive, all letters are treated as lowercase
^ // from the beginning
\w // contains only characters a-z or A-Z or 0-9 or _ sign
+ // and the string must be at least 1 character long
$ // to the end
您没有添加*或?或者+在子集之后,因此基本上您只查找一个字符,并且因为您没有将regexp放在^和$signs之间,所以此表达式最终将匹配至少包含一个非A-Z或A-Z、或u符号、或-破折号或0-9数字的字符的任何文本
匹配字符串,例如:
(empty string - since you told 0 or more characters)
abc09
fidjwieofoj4fio3j4fiojrfioj3ijfo
000000000000000000000
__________
and_many_many_more_as_long_as_they_contain_alpha_characters_and___sign
!
a>a
A<9
ffffffffff.dflskfdfd
00000,
]]]]]]]]]]]]]]]]]]
and so-on
mike
alice
bob10
0000000000
1111
9
php
user_example
可能是最有用的正则表达式。记住,\w只是[a-zA-Z0-9]的别名。此regexp将只匹配不为空且仅包含字母数字字符和uu符号的整个字符串
匹配字符串,例如:
(empty string - since you told 0 or more characters)
abc09
fidjwieofoj4fio3j4fiojrfioj3ijfo
000000000000000000000
__________
and_many_many_more_as_long_as_they_contain_alpha_characters_and___sign
!
a>a
A<9
ffffffffff.dflskfdfd
00000,
]]]]]]]]]]]]]]]]]]
and so-on
mike
alice
bob10
0000000000
1111
9
php
user_example
<?php
function isValidUsername($username)
{
return preg_match('/^\w{3,15}$/', $username) == 1;
}
echo isValidUsername('mike999') ? 'Yes' : 'No' , '<br>';
echo isValidUsername('alice!') ? 'Yes' : 'No';
您可能需要/^[:alnum:][u]+$/
。如果(preg\u match('/[^\\w]/',$username)==1),请尝试此。为了便于测试,请查看您的所有正则表达式模式是否正确。您的使用或处理逻辑错误。可能在其他地方,@CodeGnome No,这不会解决op的问题-你能指出为什么他/她的其他模式是错误的,而你的模式是正确的吗?-1解释不了什么。废话。所以这不是代码交换。“OP显然在理解逻辑上有问题。”马里奥,我不同意。明确的“好用户名”和带有“坏用户名”的else
,用于演示比较应该如何工作。看看op的第一个例子——他/她有相反的逻辑。不管怎样,这几乎不值得投反对票。@Madbreaks:事实上,它现在应该投两票。这个迟钝的人不仅抄袭了另一个答案的事实真相,而且毫无意义。该函数在此上下文中只能返回一个trueish值。除了cargo cult编程之外,严格的比较还有什么其他用途?@mario可以更好地控制和理解preg_match()的工作原理,从而使OP能够防御性编程。它更显式,对于任何具有多个可能返回类型的函数,PHP开发人员都应该习惯于使用它。@mario