2

特定の文字は HTML で特別な意味を持ち、その意味を保持する場合はHTML エンティティで表す必要があります。

これは、私が持っている限られた知識で、PHP の 2 つの異なる方法で簡単に実行できます。このような:

<?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()に、私がやろうとしていることに対して、2つのうちどちらがより良い選択でしょうか? (パフォーマンスに関しては、つまり。)


アップデート

わかりました、これにはもっとコンテキストが必要です。これは私が実際にやろうとしていることです:

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

二重エスケープを避けるために、各配列の先頭に&andを移動する必要があります。&amp;その後、 just を使用することをお勧めしstr_replaceます。なぜなら、これにより、何をしようとしているのかがより明確になるからです (とにかく、私にとって — ネストされた関数呼び出しは混乱を招く可能性があります!)。しかし、それは本当にあなた次第です。パフォーマンスの違いは目立ちません。大きな文字列は他の問題を引き起こします。

于 2013-09-28T15:00:04.270 に答える