0

いくつかの HTML スニペットを解析しようとしていますが、さまざまな理由 (XSS など) でそれらをクリーンアップしたいと考えています。

現在、アンカーの href を除いて、タグのすべての属性を削除しようとしています。私は一連の eregi_replace 呼び出しを使用してこれを行っていますが、preg_replace とわずか数行のコードを使用してこれを行うよりスマートな方法があると確信していますが、それを機能させることができませんでした。誰でも助けることができますか?

現在のコード:

$data_item = eregi_replace("<p[^>]*>","<p>", $data_item);
$data_item = eregi_replace("<h2[^>]*>","<h2>", $data_item);
$data_item = eregi_replace("<h3[^>]*>","<h3>", $data_item);
$data_item = eregi_replace("<h4[^>]*>","<h4>", $data_item);
$data_item = eregi_replace("<h5[^>]*>","<h5>", $data_item);
$data_item = eregi_replace("<h6[^>]*>","<h6>", $data_item);
$data_item = eregi_replace("<ul[^>]*>","<ul>", $data_item);
$data_item = eregi_replace("<ol[^>]*>","<ol>", $data_item);
$data_item = eregi_replace("<li[^>]*>","<li>", $data_item);

$data_item = preg_replace("/<a([^>]*)( href=\S+)([^>]*)>/i", '<a$2 rel="nofollow">', $data_item);

(HTML タグのサブセットのみを解析する必要があります。その前に、望ましくないものを取り除きます)。

4

1 に答える 1

3

任意のタグに一致する一般的な正規表現を使用しpreg_replace_callback()て、特定のタグを何に置き換えるかを決定できるようにしてみませんか? そうすれば、一致したタグがタグであるかどうかを確認し、aそうであれば、href を置き換えず、それ以外の場合はすべてを置き換える単純な関数を持つことができます。

または、次のようなこともできます。

$data_item = preg_replace("/<(p|h2|h3|h4|h5|h6|ul|ol)[^>]*>/i","<$1>", $dataitem);

()正規表現のグループが一致したタグのタイプをキャプチャする場合、 は指定さ|れたタグのいずれかと一致する「または」演算子であり$1、置換テキストの は最初の (そして唯一の) キャプチャによって一致したものを置き換えるために使用されますパターンからグループ化します。

于 2009-11-30T07:21:37.197 に答える