某些字符在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('<', '>', '&', ''', '"'), $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('<', '>', '&', ''', '"', ''', ''', '"', '"', '"', '/', '[', ']'),
$some_code
) . '</code></pre>';
?>
VERSUS:
<?php
$some_code = '<a href="#test">Test</a>';
return '<pre><code>' . str_replace(
array( '‘', '’', '“', '”', '/', '[', ']' ),
array(''', ''', '"', '"', '"', '/', '[', ']'),
htmlspecialchars( $content, ENT_QUOTES )
) . '</code></pre>';
?>
答案 0 :(得分:1)
您应该将&
和&
移到每个数组的开头,以避免双重转义。在那之后,我建议只使用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('&','<','>','\','/','"','''), $orgy);
}
echo "str_replace took " . (microtime(true) - $startTime) . " to finish\n";
?>