在做表单验证时对用户姓名的验证规则有以下要求
要求:输入的内容需要满足的条件是:
1、允许输入字符:数字(0-9)、字母(a-z和A-Z)、汉字、下划线(_)、圆点(.)和空格;
2、姓名中间允许有空格;
3、下划线、圆点和空格均为英文状态输入法下的字符;
4、姓名前后不允许输入下划线、圆点、空格和特殊字符
$str = 'abc测试 ef';
if(preg_match('/^[a-zA-Z0-9\u4e00-\u9fa5]+$|^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-Z0-9_\s\\u4e00-\u9fa5\.]*[a-zA-Z0-9\u4e00-\u9fa5]+$/', $str)){
echo"符合验证规则";
} else {
echo"不符合验证规则";
}
执行时报错:Severity: Warning
Message: preg_match() [function.preg-match]: Compilation failed:PCRE does not support \L, \l, \N{name}, \U, or \u at offset12
错误的大概意思是:preg_match()[函数。):编译失败:PCRE不支持\L, \I, \N{名称},\U或\u
后来试了几次,发现表达式中"\u4e00-\u9fa5"匹配中文时出问题了,正常情况下匹配中文是这样写的啊,所以很纳闷,于是在网上搜了搜发现在PHP中不支持这样的表达式匹配中文
网上在一篇“模式修正符”的文章中介绍到:
u(PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 php4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8合法性。
既然是不兼容,那php中是如何匹配到中文呢?
仔细查了查发现php中utf-8编码下用正则表达式匹配汉字的最终正确表达式是:
/^[\x{4e00}-\x{9fa5}]+$/u
于是将“\u4e00-\u9fa5”替换成“\x{4e00}-\x{9fa5}”进行尝试。
if(preg_match('/^[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$|^[a-zA-Z0-9\x{4e00}-\x{9fa5}][a-zA-Z0-9_\s\\x{4e00}-\x{9fa5}\.]*[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$/u', $str)){
echo"符合验证规则";
} else {
echo"不符合验证规则";
}
互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。
更多PHP相关技术请搜索千锋PHP,做真实的自己,用良心做教育。。
要求:输入的内容需要满足的条件是:
1、允许输入字符:数字(0-9)、字母(a-z和A-Z)、汉字、下划线(_)、圆点(.)和空格;
2、姓名中间允许有空格;
3、下划线、圆点和空格均为英文状态输入法下的字符;
4、姓名前后不允许输入下划线、圆点、空格和特殊字符
$str = 'abc测试 ef';
if(preg_match('/^[a-zA-Z0-9\u4e00-\u9fa5]+$|^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-Z0-9_\s\\u4e00-\u9fa5\.]*[a-zA-Z0-9\u4e00-\u9fa5]+$/', $str)){
} else {
}
执行时报错:Severity: Warning
Message: preg_match() [function.preg-match]: Compilation failed:PCRE does not support \L, \l, \N{name}, \U, or \u at offset12
错误的大概意思是:preg_match()[函数。):编译失败:PCRE不支持\L, \I, \N{名称},\U或\u
后来试了几次,发现表达式中"\u4e00-\u9fa5"匹配中文时出问题了,正常情况下匹配中文是这样写的啊,所以很纳闷,于是在网上搜了搜发现在PHP中不支持这样的表达式匹配中文
网上在一篇“模式修正符”的文章中介绍到:
u(PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 php4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8合法性。
既然是不兼容,那php中是如何匹配到中文呢?
仔细查了查发现php中utf-8编码下用正则表达式匹配汉字的最终正确表达式是:
/^[\x{4e00}-\x{9fa5}]+$/u
于是将“\u4e00-\u9fa5”替换成“\x{4e00}-\x{9fa5}”进行尝试。
if(preg_match('/^[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$|^[a-zA-Z0-9\x{4e00}-\x{9fa5}][a-zA-Z0-9_\s\\x{4e00}-\x{9fa5}\.]*[a-zA-Z0-9\x{4e00}-\x{9fa5}]+$/u', $str)){
} else {
}
互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。