2

某些字符在 HTML 中具有特殊意义,如果要保留其含义,则应由 HTML 实体表示。

以我所拥有的有限知识,可以在 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()简单地使用over有多容易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>';

?>

相对:

<?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>';

?>
4

2 回答 2

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";
?>
于 2014-02-01T11:27:59.003 回答
1

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

于 2013-09-28T15:00:04.270 回答