2012-02-24 57 views
4

移除多個空格的常見解決方案,讓多個空格變成一個空格是通過使用正則表達式如下:沒有正則表達式中PHP

preg_replace('/\s+/',' ',$str); 

但是,正則表達式往往是緩慢的,因爲它具有裝載正則表達式引擎。有沒有非正則表達式的方法來做到這一點?

+5

的正則表達式是不是慢....我懷疑你可以找到一個更快的方法,expecially如果白色空間差異(空格,換行符,標籤等)。 – Wrikken 2012-02-24 14:49:20

+0

除正則表達式之外的任何東西都是黑客,因此可能會更慢。使用該語言附帶的工具可能是最好的主意。你說正則表達式往往很慢。你有基準嗎?除非你處理大量的數據,否則你可能不會注意到它。 – TecBrat 2012-02-24 14:53:02

+0

你可以遍歷所有的字符,並刪除所有的空格後,你發現第一個,如果他們是順序,但我認爲這種方法比正則表達式慢... – 2012-02-24 14:56:29

回答

6

嘗試

while(false !== strpos($string, ' ')) { 
    $string = str_replace(' ', ' ', $string); 
} 
+0

代碼是不會處理的標籤。 – Bill 2012-02-24 15:00:28

+0

@ Bill或任何其他類型的空白。 – 2016-02-20 13:17:44

4

更新

function replaceWhitespace($str) { 
    $result = $str; 

    foreach (array(
     " ", " \t", " \r", " \n", 
    "\t\t", "\t ", "\t\r", "\t\n", 
    "\r\r", "\r ", "\r\t", "\r\n", 
    "\n\n", "\n ", "\n\t", "\n\r", 
) as $replacement) { 
    $result = str_replace($replacement, $replacement[0], $result); 
    } 

    return $str !== $result ? replaceWhitespace($result) : $result; 
} 

相比:

preg_replace('/(\s)\s+/', '$1', $str); 

手工製作的函數運行大約15%的非常長(300KB +)串更快。

(我的機器至少上)

+0

任何人都有一段時間來測試性能比較嗎?假設純空間而不擔心其他空格。 – Chris 2012-02-24 14:55:27

+0

@Chris不是最好的測試,但是:http://codepad.org/fGM9dE41 – Yoshi 2012-02-24 14:59:30

+0

有趣的是,如果我正在閱讀正確的正則表達式,它需要長達6倍的時間。關於正則表達式引擎的加載時間的問題不像preg_replace整體看起來那麼慢。 (同樣在特定的情況下,空格) – Chris 2012-02-24 15:05:17

相關問題