function detectUTF8($string)
{
    return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
        )+%xs', 
    $string);
}求大牛详细解释下上面这个函数中正则的具体含义,感谢
主要是正则的开头和结尾

解决方案 »

  1.   

    %这里应该是边界
    ()表示括号中的内容作为一个子模式匹配
    ?:表示不捕获匹配的文本,也不给此分组分配组号
    +表示花括号中的内容可以出现一次或多次
    x和s是模式修正符
    x表示模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。
    s表示匹配模式中的多行
      

  2.   

    100分哪,我也说一点吧,希望能给点分。%%是边界符号,这个边界符号是成对的 比如有人喜欢用:
    preg_match('/xxxxx/',$str,$arr); //两个“/”作为边界
    preg_match('|xxxxx|',$str,$arr); //“|”作为边界
    preg_match('#xxxxx#',$str,$arr); //“#”作为边界等等
      

  3.   

    前后%是边界符
    (?:某某某)表示'某某某'不作为子匹配输出,但必须存在该匹配
    修正符x表示忽略正则中未指定的空白符,因为你的正则是多行缩进的(换言之换行符、tab被认为是正则之一),这个修正把这些换行和缩进都忽略了,认为是完整一行
    修正符s表示如果有'.'也包含换行符,一般'.'仅指换行符以外的所有字符,貌似s在这个正则没意义题外:(?!某某某)表示'某某某'不作为子匹配,且必须存在该匹配
      

  4.   

    不太明白细节,我现在只能看出来时对$string进行多个或者条件的查找耐心根据条件一个个来。
      

  5.   

    这个函数的作用是检测字符串string中是否有两个字节以上形式编码的字符。如果有则返回 1 如果没有则返回 0
    举例:$s = '"abcdfadsdf123._-!@#$%^';
    echo  detectUTF8($s);
    //输出: 0  //表示没有双字节或以上字符$s = '"abcdf世界你好adsdf123._-!@#$%^';//这里的中文是GBK编码的
    echo  detectUTF8($s);
    //输出: 1  //表示有双字节或以上字符$s = '"abcdf世界你好adsdf123._-!@#$%^';//这里的中文是UTF8编码的
    echo  detectUTF8($s);
    //输出: 1  //表示有双字节或以上字符其他四字节编码的字符我没有见过,可能印度 阿拉伯 伊斯兰 文字是这样的编码,还有一些特别字符有可能是这样的编码。对于四字节以上的编码我没有见过,只是猜测。
      

  6.   

    \xC2 这种形式是:字符的ascii码的16进制的形式。
      

  7.   


         看来你的正则和数据库技术是越来越厉害了。在PHP里几乎处处都有你的身影,
         顺祝你这拿个皇冠,多拿几朵花!我不是来拿分的,路过顶一下,我正则很差,没有技术发言权!