0

ユーザーがグローバル通知をシステムに投稿できるフォームがあります (他のユーザーが見ることができるように)。
システムは、DB から直接 HTML を出力します (ユーザーが通知を見たい場合)。
一部の html タグはそのままにして、残りのタグには htmlspecialchars() を適用したいと考えています。
もう応募してみた

 str_replace($search, $replace, htmlspecialchars($str))

戦略ですが、本当に遅いようです。実際、遅すぎます。また、常に機能することは安全ではありません。これに代わるものはありますか?
タグをストライピングする代わりに、許可されていないタグに htmlspecialchars を適用することを除いて、strip_tags() ジョブを実行するものが必要でした。

ADD(ed) info (by request):

$str は考えられる任意のサイズにすることができます。最悪のケースのシナリオの 1 つをテストするという理由で、大きな文字列 (1M 文字 (許可されたタグと許可されていないタグを含むランダムに生成された 1M 文字。すべてのタグには属性がありました) を使用することを考えました。ロジック: このように機能する場合は、サーバーは完全なstr_replace
(htmlspecialchars を使用) を処理するのに 5 秒かかりました. このテストは 2GHz CPU と DDR3 RAM を搭載した私のコンピューターで行われました.
$search と $replace の両方で合計 7 つの置換があります. それでもそれらは機能します. $search が誤検知または誤検知を与える場合もあります.
明確にするために、DB からの取得中ではなく、DB への保存中にこれらの変更を適用します。

4

2 に答える 2

1

str_replaceISNと一緒にhtmlspecialchars遅くなりません。

おそらく、どこかにボトルネックがあります。

于 2011-06-03T10:07:46.960 に答える
1

このコードを試すことができます(改善する必要があります):

function callback(array $matches) {
    return htmlspecialchars_decode($matches[0]);
}
$str = 'some <i>string</i> <b>with</b> tags '
     . '<a href="#">some link</a> '
     . '<img alt="" src="http://sstatic.net/stackoverflow/img/favicon.ico"/><hr/>';
$str = htmlspecialchars($str);
$str = preg_replace_callback('#(&lt;(i|a)(?: .+?)?&gt;.*?&lt;/(\1)&gt;|&lt;(?:img)(?: .*?)?/&gt;)#', 'callback', $str);
echo $str;

正規表現は、次の 2 種類の文字列を検索します (検索する必要があります)。

  • <tag attributes>content</tag>tag一部は終了タグの開始と同じで、attributesオプションcontentです
  • <tag attributes/>attributesオプションである

タグは、タグの種類とタグの種類に(i|a)分けてリストされています。<tag></tag>(?:img)<tag/>

一致するタグが見つかった場合は、コンテンツをcallback()関数に渡し、 を使用してコンテンツを元に戻しhtmlspecialchars_decode()ます。これは、属性リスト内の引用符やその他のエンコードされた文字をデコードするために必要です。

すべての場合に機能するかどうか、つまり、必要なすべてのタグに一致するかどうかはわかりません。これが一般的に機能する場合は、パターンとcallback()機能を改善して、 、文字、および属性のリストcallback()のみをデコードする必要があります。タグの内容 (つまり、の一部) をデコードしてはなりません。<>some link<a href='#'>some link</a>

于 2011-06-03T10:46:58.550 に答える