如果我有一个PHP字符串,如何以有效的方式确定它是否包含至少一个非ASCII字符?而非ASCII字符,我的意思是任何不属于此表的字符,http://www.asciitable.com/,位置32 - 126包含。
因此,它不仅必须是ASCII表的一部分,而且还必须是可打印的。我想检测一个字符串,其中包含至少一个不符合这些规范的字符(不可打印的ASCII或完全不同的字符,例如不属于该表的Unicode字符。
答案 0 :(得分:57)
我发现检测列表中是否有任何字符更有用
if(preg_match('/[^\x20-\x7f]/', $string))
答案 1 :(得分:32)
您可以使用mb_detect_encoding
并检查ASCII:
mb_detect_encoding($str, 'ASCII', true)
如果$str
包含至少一个非ASCI字符(字节值> 0x7F),则返回 false 。
答案 2 :(得分:2)
答案 3 :(得分:2)
答案 4 :(得分:2)
尝试:(Source)
function is_ascii( $string = '' ) {
return ( bool ) ! preg_match( '/[\\x80-\\xff]+/' , $string );
}
尽管上述所有答案都是正确的,但根据输入,这些解决方案可能会给出错误答案。请参阅this ASCII validation post中的最后一部分。
答案 5 :(得分:2)
如果所有字符都属于ASCII范围32-126(ctype_print),函数PHP unit test将返回true。
答案 6 :(得分:0)
我建议您查看PHP手册中的utf8_encode或utf8_decode:
http://www.php.net/manual/en/function.utf8-encode.php
请查看下面的示例,因为如果没有找到您要查找的内容,可能会有一些内容可以引导您找到正确的方向。
答案 7 :(得分:0)
如果您不想在javascript中处理Regex
,则可以
detectUf8 : function(s) {
var utf8=s.split('').filter(function(C) {
return C.charCodeAt(0)>127;
})
return (utf8.join('').length>0);
},
答案 8 :(得分:0)
我对建议的功能进行了基准测试,因为我需要进行此检查才能对较短的字符串(最多1000个字符)进行批处理。我测试了30种不同字符串(空,短,较长,ascii,重音,日语,emoji,non-ascii开始,non-ascii等)的10k次迭代。大致结果如下:
mb_check_encoding :平均95毫秒。随着字符串变长(超过1MB),性能会比preg_match和ctype更快地降低。
mb_check_encoding($input, 'ASCII');
preg_match :平均85毫秒。对于1MB +的字符串来说,速度相当快(遍历字符串,如果字符串开头有非ASCII字符,则速度更快)。
!preg_match('/[\\x80-\\xff]/', $input);
ctype_print :平均83毫秒。 1MB +字符串的速度相当快(遍历字符串,如果字符串开头有非ASCII字符,则速度更快)。 请注意,这实际上不是ASCII检查。
ctype_print($input);
while / ord :平均500毫秒。我仍在等待1MB +的字符串测试完成。
function is_ascii($input) {
$num = 0;
while( isset( $string[$num] ) ) {
if( ord( $string[$num] ) & 0x80 ) {
return false;
}
$num++;
}
return true;
}