PHP 中的 RegEx 帮助
RegEx help in PHP
我真的在寻找我的问题的答案,但似乎找不到。如果我在这里创建一个副本,请原谅我。
我的问题是我正在创建一个脚本,我需要验证一个用户名,我意识到这必须使用正则表达式来完成;我吸进去了。
- 可以包含任何字符;甚至是俄语、中文、希腊语、瑞典语等当地语言
- 可以包含下划线、连字符和点。
- 可以包含数字
- 只能包含一个空格。
哪些用户名不能包含,如下:
! " # ¤ % & / ( ) = ? ` \ ´ ' ^ ~ ¨ § | @ £ $ € { [ ] }`
因此,究竟如何基于此创建正则表达式超出了我的技能范围。我还没有找到一个具有相同要求的 question/answer。伙计们,我很乐意帮助您创建此正则表达式。
$pattern = '/[^\!\¤\%\&\/\(\)\=\?\`\\^\~\¨\§\|\@\£$\€\{\[\]\}\"\']+/';
preg_match($pattern, "test test test");
应该可以解决问题。这实际上创建了一个白名单。它检查字符串中除这些字符以外的所有字符,但 ^
对此负责。当字符串包含 normal
个字符时它应该 return 1,当字符串包含黑名单字符之一时它应该是 0。
要检查空格,请额外执行 preg_match。
$pattern = '/^[^ ]* [^ ]*$/';
preg_match($pattern, "test test test"); //should return 0.
您可以分两步完成,检查与此 preg_match_all
和 preg_quote
(RegEx):
的任何匹配项
(将 return 匹配数)
$pattern = preg_quote("!\"#¤%&()=?`´'^~¨§|@£$€{[]}]");
preg_match_all("/[$pattern]/", $password);
然后计算密码中的空格:
substr-count
int substr_count ($password , " ");
综合起来
$pattern = preg_quote("!\"#¤%&()=?`´'^~¨§|@£$€{[]}]","/");
if (!preg_match_all("/[$pattern]/", $password) and (substr_count ($password , " ") < 2)) {
//Pasword is OK
echo "Works!\n";
} else {
//Password has issues
echo "Does not work :( \n";
}
或者使用更有效的strpbrk(returns 是模式中第一个字符匹配后的字符串):
$pattern = "!\"#¤%&()=?`´'^~¨§|@£$€{[]}]";
if (!strpbrk($password,$pattern) and (substr_count ($password , " ") < 2)) {
//Pasword is OK
echo "Works!\n";
} else {
//Password has issues
echo "Does not work :( \n";
}
卑尔根理查德祝你好运:D
尝试使用:
^(?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+)(?: (?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+))$
\x{2D} ...匹配字符-
\x{2E} ... 匹配字符 .
\x{5F} ... 匹配字符 _
\p{L} ... 匹配任何 Unicode 字母。
\p{N} ... 匹配任何 Unicode 数字。
if (preg_match('/^(?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+)(?: (?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+))$/usim', $subject)) {
# Successful match
} else {
# Match attempt failed
}
我真的在寻找我的问题的答案,但似乎找不到。如果我在这里创建一个副本,请原谅我。
我的问题是我正在创建一个脚本,我需要验证一个用户名,我意识到这必须使用正则表达式来完成;我吸进去了。
- 可以包含任何字符;甚至是俄语、中文、希腊语、瑞典语等当地语言
- 可以包含下划线、连字符和点。
- 可以包含数字
- 只能包含一个空格。
哪些用户名不能包含,如下:
! " # ¤ % & / ( ) = ? ` \ ´ ' ^ ~ ¨ § | @ £ $ € { [ ] }`
因此,究竟如何基于此创建正则表达式超出了我的技能范围。我还没有找到一个具有相同要求的 question/answer。伙计们,我很乐意帮助您创建此正则表达式。
$pattern = '/[^\!\¤\%\&\/\(\)\=\?\`\\^\~\¨\§\|\@\£$\€\{\[\]\}\"\']+/';
preg_match($pattern, "test test test");
应该可以解决问题。这实际上创建了一个白名单。它检查字符串中除这些字符以外的所有字符,但 ^
对此负责。当字符串包含 normal
个字符时它应该 return 1,当字符串包含黑名单字符之一时它应该是 0。
要检查空格,请额外执行 preg_match。
$pattern = '/^[^ ]* [^ ]*$/';
preg_match($pattern, "test test test"); //should return 0.
您可以分两步完成,检查与此 preg_match_all
和 preg_quote
(RegEx):
的任何匹配项
(将 return 匹配数)
$pattern = preg_quote("!\"#¤%&()=?`´'^~¨§|@£$€{[]}]");
preg_match_all("/[$pattern]/", $password);
然后计算密码中的空格: substr-count
int substr_count ($password , " ");
综合起来
$pattern = preg_quote("!\"#¤%&()=?`´'^~¨§|@£$€{[]}]","/");
if (!preg_match_all("/[$pattern]/", $password) and (substr_count ($password , " ") < 2)) {
//Pasword is OK
echo "Works!\n";
} else {
//Password has issues
echo "Does not work :( \n";
}
或者使用更有效的strpbrk(returns 是模式中第一个字符匹配后的字符串):
$pattern = "!\"#¤%&()=?`´'^~¨§|@£$€{[]}]";
if (!strpbrk($password,$pattern) and (substr_count ($password , " ") < 2)) {
//Pasword is OK
echo "Works!\n";
} else {
//Password has issues
echo "Does not work :( \n";
}
卑尔根理查德祝你好运:D
尝试使用:
^(?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+)(?: (?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+))$
\x{2D} ...匹配字符-
\x{2E} ... 匹配字符 .
\x{5F} ... 匹配字符 _
\p{L} ... 匹配任何 Unicode 字母。
\p{N} ... 匹配任何 Unicode 数字。
if (preg_match('/^(?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+)(?: (?:[\x{2D}\x{2E}\x{5F}\p{L}\p{N}]+))$/usim', $subject)) {
# Successful match
} else {
# Match attempt failed
}