2013-05-05 104 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),速度会变慢。