2013-05-05 102 views
13
htmlspecialchars($string, ENT_NOQUOTES); 

...慢於約2.5倍爲什麼「htmlspecialchars」這麼慢?

str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $string); 

是否htmlspecialchars做一些事情,在str_replace行不?

p.s.我使用microtime在PHP 5.4中測量速度。

+3

@Juampi刺戳ENT_NOQUOTES是什麼意思... – 2013-05-05 12:31:46

+5

這是源代碼https://github.com/php/php-src/blob/master/ext/standard/html.c它有額外的工作與考慮預先使用字符集,使用不同的替換集而不是固定的str_replace列表等。 – mario 2013-05-05 12:32:40

+1

還可以更好地使用'strtr'而不是'str_replace'。但這只是一條評論。 – hakre 2013-05-05 13:45:29

回答

12

str_replace()將字符串視爲ASCII C字符串。 htmlspecialchars()沒有。 (如果是內存服務,它的默認值是UTF8字符串。)

此外,htmlspecialchars()中有代碼以避免雙重編碼等等。它可以做更多的事情。

+0

您可以舉一個例子,說明使用' htmlspecialchars'超過'str_replace'? – 2013-05-05 12:48:42

+0

除了雙重編碼的問題,大概是'str_replace()'會高興地接受無效的UTF8字符串,而'htmlspecialchars()'可能不會。回想一下爲什麼'mysql_real_escape_string()'在當天被引入:由於當您不擔心編碼時可能發生sql注入。 – 2013-05-05 12:54:15

0

該文檔指出htmlspecialchars()有一個參數,您可以在其中輸入您希望使用的字符集,並且默認情況下它還會將所有內容都編碼兩次。

2

看看documentation

它慢的原因是因爲它做得更多。它處理各種引號,編碼和雙重編碼。

使用編碼可能會很慢。因爲計算機速度非常快,所以不應該太重要,但如果將其與簡單的搜索和替換進行比較(基本上都是str_replace),速度會變慢。