检查用户名是否包含我定义的一些特殊字符的有效方法是什么。
示例:%#^。 ! @& ()+ /“?`〜<> {} [] | = - ;
我需要检测它们并返回一个布尔值,而不仅仅是将它们剥离出来。
可能是一个非常简单的问题,但我需要一个更好的方法,而不是大量的条件或一个草率的循环。
答案 0 :(得分:9)
更好的是确定是否有任何不在允许列表中的字符,例如:
preg_match('![^a-z0-9]!i', $nickname);
答案 1 :(得分:3)
对于正则表达式,\ w特殊字符表示“任何单词字符”,\ d表示数字。括号中的^表示否定或基本上不在括号中的任何内容。下面的代码将回显“true”或1表示字符串中包含非单词字符。
$string = '% # ^ . ! @ & ( ) + / " ? ` ~ < > { } [ ] | = - ;'
echo preg_match('~[^\w\d]~', $string);
答案 2 :(得分:3)
正则表达式通常是测试允许范围的方法,尤其是字母数字实体,例如用户名。但是,如果不允许的字符集很小和/或非顺序(即,不容易使用范围指定),您可以通过以下方式获得更好的性能:
strspn($string,'%#^.!@&()+/"?`~<>{}[]|=-');
返回找到的第一个子字符串的长度,该字符串仅由不允许的字符组成(如果不存在不允许的字符,则为0)。
答案 3 :(得分:2)
您可以使用以下内容来计算给定字符集中的字符出现在字符串中的次数:
<?php
/**
* Count the number of times any char from $char is found in $search
* @param $search Looks for the chars here
* @param $chars The chars to look for
* @return int
*/
function countChars($search, $chars)
{
$chars = str_replace(
array("\\", '[', ']', '^', '-'),
array("\\\\", '\[', '\]', '\^', '\-'), $chars);
$results = array();
preg_match_all("/[$chars]/", $search, $results, PREG_SET_ORDER);
return count($results);
}
var_dump(countChars("Hello, World", "ol"));
var_dump(countChars("Lorem ipsum...", ".m")); // searches for . and m only
var_dump(countChars("^[]-^\\*", "^[]-\\"));
希望有所帮助。