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);
}求大牛详细解释下上面这个函数中正则的具体含义,感谢
主要是正则的开头和结尾
{
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);
}求大牛详细解释下上面这个函数中正则的具体含义,感谢
主要是正则的开头和结尾
()表示括号中的内容作为一个子模式匹配
?:表示不捕获匹配的文本,也不给此分组分配组号
+表示花括号中的内容可以出现一次或多次
x和s是模式修正符
x表示模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。
s表示匹配模式中的多行
preg_match('/xxxxx/',$str,$arr); //两个“/”作为边界
preg_match('|xxxxx|',$str,$arr); //“|”作为边界
preg_match('#xxxxx#',$str,$arr); //“#”作为边界等等
(?:某某某)表示'某某某'不作为子匹配输出,但必须存在该匹配
修正符x表示忽略正则中未指定的空白符,因为你的正则是多行缩进的(换言之换行符、tab被认为是正则之一),这个修正把这些换行和缩进都忽略了,认为是完整一行
修正符s表示如果有'.'也包含换行符,一般'.'仅指换行符以外的所有字符,貌似s在这个正则没意义题外:(?!某某某)表示'某某某'不作为子匹配,且必须不存在该匹配
举例:$s = '"abcdfadsdf123._-!@#$%^';
echo detectUTF8($s);
//输出: 0 //表示没有双字节或以上字符$s = '"abcdf世界你好adsdf123._-!@#$%^';//这里的中文是GBK编码的
echo detectUTF8($s);
//输出: 1 //表示有双字节或以上字符$s = '"abcdf世界你好adsdf123._-!@#$%^';//这里的中文是UTF8编码的
echo detectUTF8($s);
//输出: 1 //表示有双字节或以上字符其他四字节编码的字符我没有见过,可能印度 阿拉伯 伊斯兰 文字是这样的编码,还有一些特别字符有可能是这样的编码。对于四字节以上的编码我没有见过,只是猜测。
看来你的正则和数据库技术是越来越厉害了。在PHP里几乎处处都有你的身影,
顺祝你这拿个皇冠,多拿几朵花!我不是来拿分的,路过顶一下,我正则很差,没有技术发言权!