如何检测字符串中的非ASCII字符?

时间:2011-06-27 19:09:31

标签: php string

如果我有一个PHP字符串,如何以有效的方式确定它是否包含至少一个非ASCII字符?而非ASCII字符,我的意思是任何不属于此表的字符,http://www.asciitable.com/,位置32 - 126包含。

因此,它不仅必须是ASCII表的一部分,而且还必须是可打印的。我想检测一个字符串,其中包含至少一个不符合这些规范的字符(不可打印的ASCII或完全不同的字符,例如不属于该表的Unicode字符。

9 个答案:

答案 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)

您可以使用:

mb_detect_encoding

但它可能不像你想要的那样精确。

答案 3 :(得分:2)

尝试(mb_detect_encoding

答案 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;
}