1

許可されたタグのすべてのタグ プロパティと、許可されたリストに存在しないすべてのタグを消去する preg_replace を作成しようとしています。

基本的な例 - これ:

<p style="some styling here">Test<div class="button">Button Text</div></p> 

次のようになります。

<p>test</p>

これはうまく機能しています..imgタグとa hrefタグを除いて。img と a タグのプロパティをきれいにする必要はありません。おそらく他の人。2 つの許可リストを設定する方法があるかどうかわかりませんでした。

1) クリーニング後に
残すことが許可されているタグの 1 つのリスト 2) 許可されているが放置されているタグの 1 つのリスト
3) 残りは削除されます。

これが私が取り組んでいるスクリプトです:

$string = '<p style="width: 250px;">This is some text<div class="button">This is the button</div><br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p>';

$output = strip_tags($string, '<p><b><br><img><a>');
$output = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i", '<$1$2$3$4$5>', $output);

echo $output;

このスクリプトは $string を次のように消去する必要があります。

<p>This is some text<br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p>
4

1 に答える 1

1

http://ideone.com/aoOOUN

この関数は、許可されていないサブ要素の要素を削除し、「削除された」サブ要素を削除して、残りを (再帰的に) 残します。

function clean($element, $allowed, $stripped){
    if(!is_array($allowed) || ! is_array($stripped)) return;
    if(!$element)return;
    $toDelete = array();
    foreach($element->childNodes as $child){
        if(!isset($child->tagName))continue;
        $n = $child->tagName;
        if ($n && !in_array($n, $allowed) && !in_array($n, $stripped)){
            $toDelete[] = $child;
            continue;
        }
        if($n && in_array($n, $stripped)){
            $attr = array();
            foreach($child->attributes as $a)
                $attr[] = $a->nodeName;
            foreach($attr as $a)
                $child->removeAttribute($a);
        }
        clean($child, $allowed, $stripped);
    }
    foreach ($toDelete as $del)
        $element->removeChild($del);
}

これは、文字列をきれいにするコードです:

$xhtml = '<p style="width: 250px;">This is some text<div class="button">This is the button</div><br><img src="waves.jpg" width="150" height="200" /></p><p><b>Title</b><br>Here is some more text and <a href="#" target="_blank">this is a link</a></p>';

$dom = new DOMDocument();
$dom->loadHTML($xhtml);
$body = $dom->getElementsByTagName('body')->item(0);
clean($body, array('img', 'a'), array('p', 'br', 'b'));
echo preg_replace('#^.*?<body>(.*?)</body>.*$#s', '$1', $dom->saveHTML($body));

PHP の DOM クラスのドキュメントを確認してください。

于 2013-06-10T17:41:46.770 に答える