说实话,我并没有获得 RegEx。所以我完全忘记了我在这里出错的地方。
我正在寻找一个接受字母数字字符仅的RegEx(和下划线,它是用户名)。我在这里搜索过,发现了很多我尝试过的RegExes示例,其中没有一个有效。
其中,我大部分都是从这里的答案中得到的,我试过了
^[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
}
...等 它每次都接受特殊字符(我试过&,$,^和%)。
我到底错在了什么?它是RegEx的格式吗?这是我要它检查的方式吗?
另外,如果找到特殊字符,我得到的返回类型究竟是什么? (即一个我不想要接受)
答案 0 :(得分:7)
preg_match
返回1,如果输入字符串不匹配,则返回0。
您希望用户名中的每个字符都是字母数字(加上下划线)。一种PCRE表达方式是方括号内有character class,如下所示:[A-Za-z0-9_]
。有几种方法可以使用这个基本类来做你想做的事。
一种方式是"否定"搜索:尝试匹配非 - 字母数字字符,如果这样做,则测试失败。为此,我们只需在角色类的前面添加一个克拉。这意味着我们会匹配该集合中的任何字符而不是。
因此,以下模式匹配"任何非字母数字,非下划线字符。"在这里,匹配意味着无效的用户名:
if (preg_match('/[^A-Za-z0-9_]/', $username)) {
// invalid username
}
或者,你可以做相反的匹配,在那里你给出一个有效用户名的模式,并检查你是否匹配。这一次,我们根本不会更改角色类本身,但我们会在其后添加+
量词,这意味着我们正在匹配的一个或多个 #34;良好"字符。
此外,我们将^
和$
字符串的开头和结尾包围在我们的模式周围。 (这有点令人困惑,但是一个模式开头的克拉与一个字符类开头的克拉完全不同,在括号内)。
最终结果是一种模式,意思是:"一个或多个字母数字字符(加上下划线)和别的。"与此匹配意味着有效用户名:
if (preg_match('/^[A-Za-z0-9_]+$/', $username)) {
// valid username
}
答案 1 :(得分:2)
if (preg_match("^[a-zA-Z0-9_]+$", $username) === 1) {
// Good username
}
else {
// Bad username
}
使用严格相等运算符(===)意味着我们将preg_match()返回的值与数字进行比较,而不是布尔值。如果它返回0,则表示没有匹配,布尔值为false,发生错误。有关详细信息,请查看preg_match
页面:http://php.net/manual/en/function.preg-match.php
答案 2 :(得分:0)
Per the PHP manual * preg_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.";
}
答案 3 :(得分:0)
如果你掌握了基础知识,很容易理解正则表达式:)
我会尝试向您解释您尝试的所有三种表达方式:
使用 ^ [a-zA-Z0-9 _] * $ 字符串将匹配:
^ // 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
匹配字符串例如:
(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-z_-0-9] / i 字符串将匹配:
[^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
您没有添加*或?或者在子集之后,所以基本上你只找一个字符,并且因为你没有把你的正则表达式放在^和$符号之间,这个表达式最终将匹配任何包含至少一个不是AZ或az的字符的文本,或者_符号,或 - 破折号,或0-9号。
匹配字符串例如:
!
a>a
A<9
ffffffffff.dflskfdfd
00000,
]]]]]]]]]]]]]]]]]]
and so-on
/ ^ \ w + $ / 字符串将匹配:
^ // 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
可能是最有用的正则表达式。请记住, \ w 只是[a-zA-Z0-9_]的别名。此正则表达式将仅匹配整个字符串,该字符串不为空且仅包含字母数字字符和_符号。
匹配字符串例如:
mike
alice
bob10
0000000000
1111
9
php
user_example
希望有所帮助。对于您来说,匹配有效用户名的最有用的表达式是 / ^ \ w {3,15} $ / ,因为它匹配任何长度为3到15个字符且仅包含字母数字字符的字符串和下划线符号(az AZ 0-9 _)。
试试这个:
<?php
function isValidUsername($username)
{
return preg_match('/^\w{3,15}$/', $username) == 1;
}
echo isValidUsername('mike999') ? 'Yes' : 'No' , '<br>';
echo isValidUsername('alice!') ? 'Yes' : 'No';
干杯。