DZ(UTF-8)用户名检测的一个正则:\xA1\xA1|\xAC\xA3|^Guest|^\xD3\xCE\xBF\xCD|\xB9\x43\xAB\xC8,这一段表示什么意思,很多中文英文都无法通过。文件:/uc_client/model/user.php
函数:check_username()
function check_username($username) {
$guestexp = '\xA1\xA1|\xAC\xA3|^Guest|^\xD3\xCE\xBF\xCD|\xB9\x43\xAB\xC8';
$len = $this->dstrlen($username);
if($len > 150 || $len < 3 || preg_match("/\s+|^c:\\con\\con|[%,\*\"\s\<\>\&]|$guestexp/is", $username)) {
return FALSE;
} else {
return TRUE;
}
} function dstrlen($str) {
if(strtolower(UC_CHARSET) != 'utf-8') {
return strlen($str);
}
$count = 0;
for($i = 0; $i < strlen($str); $i++){
$value = ord($str[$i]);
if($value > 127) {
$count++;
if($value >= 192 && $value <= 223) $i++;
elseif($value >= 224 && $value <= 239) $i = $i + 2;
elseif($value >= 240 && $value <= 247) $i = $i + 3;
     }
     $count++;
}
return $count;
}查看了网上很多资料,很多人都说“\xA1\xA1”指代全角,“\xAC\xA3”指代汉字“欣”?是这样吗,其他的是指代什么

解决方案 »

  1.   

    echo "\xA1\xA1|\xAC\xA3|^Guest|^\xD3\xCE\xBF\xCD|\xB9\x43\xAB\xC8";
     ||^Guest|^游客|笴
      

  2.   

    原来要双引号才显示…… 后来解决了。把“\xAC\xA3”这一段去掉,用户名才可以匹配。
      

  3.   

    还是有疑问。。其中的那个  ^c:\\con\\con 这一段指代什么?
    现在需要一个正则,匹配一行字符串里面是否有重复。但是用这个失败貌似这一段有这个功能。function hasRepeatString($string)
    {
      return preg_match("/^c:\\con\\con/is", $string,$matches) ? true:false;
    }$arr = array(
    'woshuode我说的我说的怎么了我说的',
    '我说的对,我说的',
    '你妹妹的妹妹的妹妹的',
    'ABC IS ABC NOW',
    'HEHE 是啊....ASDFASDFAS35562 A HEHE DADSFASDF',
    );
    foreach ($arr as $s)
    {
    echo hasRepeatString($s) ? "HAS":"NOT"."\t".$s."\n";
    }输出(全部都没有匹配到):X-Powered-By: PHP/5.2.0
    Content-type: text/htmlNOT woshuode我说的我说的怎么了我说的
    NOT 我说的对,我说的
    NOT 你妹妹的妹妹的妹妹的
    NOT ABC IS ABC NOW
    NOT HEHE 是啊....ASDFASDFAS35562 A HEHE DADSFASDF
      

  4.   

    c:\\con\\con
    只是个路径 c:\con\con
      

  5.   

    echo preg_match_all('/(.+).*\\1/', 'woshuode我说的我说的怎么了我说的', $r);
    print_r($r);
    2Array
    (
        [0] => Array
            (
                [0] => oshuo
                [1] => 我说的我说的怎么了我说的
            )    [1] => Array
            (
                [0] => o
                [1] => 我说的
            ))
      

  6.   

    <?function hasRepeatString($string)
    {
      preg_match_all('/(.+).*\\1/', $string, $matches);
      echo "\n\n".$string."\n";
      print_r($matches);
      //return empty($matches[1]) ?false:true;
    }$arr = array(
    'd【2次的】(8次内容)qqqq(8次内容)jjj 【2次的】 (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)',
    '【2次的】(8次内容)qqqq(8次内容)jjj 【2次的】 (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)',
    '【2次的】b(8次内容)qqqq(8次内容)jjj 【2次的】 (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)',
    );
    foreach ($arr as $s)
    {
    hasRepeatString($s);
    }X-Powered-By: PHP/5.2.0
    Content-type: text/htmld【2次的】(8次内容)qqqq(8次内容)jjj 【2次的】 (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)
    Array
    (
        [0] => Array
            (
                [0] => d【2次的】(8次内容)qqqq(8次内容)jjj 【2次的】 (8次内容)eee(8次内容)dddd
                [1] => (8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)
            )    [1] => Array
            (
                [0] => d
                [1] => (8次内容)
            ))
    【2次的】(8次内容)qqqq(8次内容)jjj 【2次的】 (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)
    Array
    (
        [0] => Array
            (
                [0] => 【2次的】(8次内容)qqqq(8次内容)jjj 【2次的】
                [1] => (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)
            )    [1] => Array
            (
                [0] => 【2次的】
                [1] => (8次内容)
            ))
    【2次的】b(8次内容)qqqq(8次内容)jjj 【2次的】 (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)
    Array
    (
        [0] => Array
            (
                [0] => 【2次的】b(8次内容)qqqq(8次内容)jjj 【2次的】
                [1] => (8次内容)eee(8次内容)dddd(8次内容)ffff(8次内容)ccc(8次内容)aaa(8次内容)
            )    [1] => Array
            (
                [0] => 【2次的】
                [1] => (8次内容)
            ))还是用不了啊,里面的那个“点”代表的字符串的长度该如何限制
      

  7.   

    <?function hasRepeatString($string,$length=10)
    {
      preg_match_all('/(.{'.$length.',}).*\\1/', $string, $matches);
      echo "\n\n{$length}:\t".$string."\n";
      print_r($matches);
      //return empty($matches[1]) ?false:true;
    }$arr = array(
    'ddd【这个长度很长的这个长度很长的 】 aaaaf【这个长度很长的这个长度很长的 】dfffddd',
    );
    foreach ($arr as $s)
    {
    hasRepeatString($s,10);
    hasRepeatString($s,3);
    hasRepeatString($s,1);
    }X-Powered-By: PHP/5.2.0
    Content-type: text/html10: ddd【这个长度很长的这个长度很长的 】 aaaaf【这个长度很长的这个长度很长的 】dfffddd
    Array
    (
        [0] => Array
            (
                [0] => 【这个长度很长的这个长度很长的 】 aaaaf【这个长度很长的这个长度很长的 】
            )    [1] => Array
            (
                [0] => 【这个长度很长的这个长度很长的 】
            ))
    3: ddd【这个长度很长的这个长度很长的 】 aaaaf【这个长度很长的这个长度很长的 】dfffddd
    Array
    (
        [0] => Array
            (
                [0] => ddd【这个长度很长的这个长度很长的 】 aaaaf【这个长度很长的这个长度很长的 】dfffddd
            )    [1] => Array
            (
                [0] => ddd
            ))
    1: ddd【这个长度很长的这个长度很长的 】 aaaaf【这个长度很长的这个长度很长的 】dfffddd
    Array
    (
        [0] => Array
            (
                [0] => ddd【这个长度很长的这个长度很长的 】 aaaaf【这个长度很长的这个长度很长的 】dfffddd
            )    [1] => Array
            (
                [0] => ddd
            ))如果那个“.”的最低长度可以限制就好了。
      

  8.   

    .* 0 到 无穷个
    .+ 1 到 无穷个
    .{n,m} n 到 m 个
      

  9.   


    谢谢了。不过这样的方法不太好,最后还是没有用了。
    这个\x开头应该是十六进制的,请问PHP中如何将中文汉字转换成“\x”开头十六进制的。
      

  10.   

    echo str_replace('%', '\x', urlencode('游客'));\xD3\xCE\xBF\xCD注意:汉字是分字符集的