str_replace()或htmlspecialchars()用于转义<pre> blocks</pre>中的特殊字符

时间:2013-09-28 14:55:35

标签: php str-replace htmlspecialchars

  

某些字符在HTML中具有特殊意义,如果要保留其含义,则为should be represented by HTML entities

凭借我所拥有的有限知识,可以在PHP中以两种不同的方式轻松完成。像这样:

<?php

   $some_code = '<a href="#test">Test</a>';

   echo '<pre><code>' . htmlspecialchars( $some_code, ENT_QUOTES ) . '</code></pre>';

?>

或者这样:

<?php

   $some_code = '<a href="#test">Test</a>';

   echo '<pre><code>' . str_replace( array('<', '>', '&', '\'', '"'), array('&lt;', '&gt;', '&amp;', '&apos;', '&quot;'), $some_code ) . '</code></pre>';

?>

(这只是为了向您展示我想要做的事情,而不是我在现实中的表现。例如,$some_code是动态提供的,而不是手动提供的。)

不考虑简单地使用htmlspecialchars()而不是str_replace()会更容易,两者中的哪一个会更好地选择我要做的事情? (就性能而言,就是这样。)


更新

好的,我发现这需要更多的背景。这就是我实际上要做的事情:

<?php

    $some_code = '<a href="#test">Test</a>';

    echo '<pre><code>' . str_replace(

        // Replace these special characters
        array( '<', '>', '&', '\'', '"', '‘', '’', '“', '”', '/', '[', ']' ),

        // With the HTML entities below, respectively
        array('&lt;', '&gt;', '&amp;', '&apos;', '&quot;', '&apos;', '&apos;', '&quot;', '&quot;', '&quot;', '&#47;', '&#91;', '&#93;'),

        $some_code

    ) . '</code></pre>';

?>

VERSUS:

<?php

    $some_code = '<a href="#test">Test</a>';

    return '<pre><code>' . str_replace(

        array( '‘', '’', '“', '”', '/', '[', ']' ),

        array('&apos;', '&apos;', '&quot;', '&quot;', '&quot;', '&#47;', '&#91;', '&#93;'),

        htmlspecialchars( $content, ENT_QUOTES )

    ) . '</code></pre>';

?>

2 个答案:

答案 0 :(得分:1)

您应该将&&amp;移到每个数组的开头,以避免双重转义。在那之后,我建议只使用str_replace,因为它使你想要做的更明显(对我来说,无论如何 - 嵌套函数调用可能会令人困惑!)但这完全取决于你。性能差异不明显;一个很大的字符串会导致其他问题。

答案 1 :(得分:1)

你绝对应该选择 htmlspecialchars()。我做了几个基准测试并得到了100000循环的结果

htmlspecialchars took 0.15800881385803 to finish
htmlentities took 0.20201182365417 to finish
str_replace took 0.81704616546631 to finish 

您可以通过此代码自行检查

<?php
$orgy = '<div style="background:#ffc">Hello World</div>';
$startTime = microtime(true);
for($i=0; $i<100000; $i++)
{
    $tmp = htmlspecialchars($orgy);
}
echo "htmlspecialchars took " . (microtime(true) - $startTime) . " to finish<br />";

$startTime = microtime(true);
for($i=0; $i<100000; $i++)
{
    $tmp = htmlentities($orgy);
}
echo "htmlentities took " . (microtime(true) - $startTime) . " to finish<br />";

$startTime = microtime(true);
for($i=0; $i<100000; $i++)
{
    $tmp = str_replace(array('&','<','>','\\','/','"','\''), array('&amp;','&lt;','&gt;','&#92;','&#47;','&quot;','&#039;'), $orgy);
}
echo "str_replace took " . (microtime(true) - $startTime) . " to finish\n";
?>