2010-11-10 46 views

回答

11

一個可能更快的功能是使用負字符類(因爲當它擊中的第一個字符的正則表達式可以只是停止,而且也沒有必要在內部捕獲任何):

function isAscii($str) { 
    return 0 == preg_match('/[^\x00-\x7F]/', $str); 
} 

沒有正則表達式(基於我的評論){

function isAscii($str) { 
    $len = strlen($str) { 
    for ($i = 0; $i < $len; $i++) { 
     if (ord($str[$i]) > 127) return false; 
    } 
    return true; 
} 

但我不得不問,你爲什麼如此關心更快?使用更具可讀性,更容易理解的版本,只擔心優化它,當你知道這是一個問題......

編輯

那麼最快將可能是mb_check_encoding

function isAscii($str) { 
    return mb_check_encoding($str, 'ASCII'); 
} 
+0

這將頻繁地運行在很多文本上,我認爲這兩個都是非常可讀的,所以在這裏速度更快肯定會更好。 – philfreo 2010-11-10 18:48:27

+0

@philfreo:更新了一個答案...但是,告訴最快的最好方法是使用您的條件實際對基準選項進行基準測試...... – ircmaxell 2010-11-10 18:52:55

+0

但顯然php的ord函數與utf-8存在問題 – barlop 2016-06-25 10:06:43

3

檢查是否有任何字節大於0x7f,或者任何字符大於U + 007F。

+1

非常簡單'$ isNotAscii = false; for($ i = 0,$ len = strlen($ string); $ i <$ len; $ i ++){if(ord($ string [$ i])> 127){$ isNotAscii = true;打破; }}。它遍歷字符串的每個字符尋找一個字符> 127 ... – ircmaxell 2010-11-10 18:21:27

+1

我相信在這種情況下preg_match會更快...沒有基準但對於字符串模式匹配,它幾乎總是 – 2010-11-10 18:48:26

0
function isAscii($str) { 
    return preg_match('/^([\x00-\x7F])*$/', $str); 
} 

// doesn't accept ASCII control characters 
function isAsciiText($str) { 
    return preg_match('/^([\x09\x0A\x0D\x20-\x7E])*$/', $str); 
} 
+0

這將失敗的一些有效ASCII控制字符 – stillstanding 2010-11-10 18:27:04

+0

查看更新的功能。這是否比迭代更快/更好? – philfreo 2010-11-10 18:30:49

相關問題