1

以下のテストなど、コンテンツの最後で適切に閉じられていないすべての要素を削除したい

commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea
voluptate velit esse quam nihil molestiae consequatur, 
vel illum qui dolorem eum fugiat quo voluptas nulla 
pariatur? <a rel="nofollow" class="underline"

削除したい

<a rel="nofollow" class="underline"

または終了タグのない要素

<h2>sample text

または最後に適切に閉じられていないその他の html 要素。

4

1 に答える 1

4

私はあなたが望むことをするべき関数を書きました。####アイデアは、最初にすべての有効なタグ シーケンスをパターンに置き換えることです。<次に、正規表現は文字列の最初から最後まですべてを削除します。その後、有効なタグ シーケンスがバッファに戻されます (その部分の前の無効なタグのためにその部分が削除されなかった場合)。

残念ながら、codepad で使用されている PHP のバージョンでは再帰的な正規表現がサポートされていないようで、codepad を追加できません。PHP 5.3.5 でこれをテストしました。

PHP

function StripUnclosedTags($input) {
    // Close <br> tags
    $buffer = str_ireplace("<br>", "<br/>", $input);
    // Find all matching open/close HTML tags (using recursion)
    $pattern = "/<([\w]+)([^>]*?) (([\s]*\/>)| (>((([^<]*?|<\!\-\-.*?\-\->)| (?R))*)<\/\\1[\s]*>))/ixsm";
    preg_match_all($pattern, $buffer, $matches, PREG_OFFSET_CAPTURE);
    // Mask matching open/close tag sequences in the buffer
    foreach ($matches[0] as $match) {
        $ofs = $match[1];
        for ($i = 0; $i < strlen($match[0]); $i++, $ofs++)
            $buffer[$ofs] = "#";
    }
    // Remove unclosed tags
    $buffer = preg_replace("/<.*$/", "", $buffer);
    // Put back content of matching open/close tag sequences to the buffer
    foreach ($matches[0] as $match) {
        $ofs = $match[1];
        for ($i = 0; $i < strlen($match[0]) && $ofs < strlen($buffer); $i++, $ofs++)
            $buffer[$ofs] = $match[0][$i];
    }
    return $buffer;
}

$str = 'commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate '
      .'velit esse<br> quam nihil molestiae consequatur,  vel illum qui dolorem eum '
      .'fugiat quo voluptas nulla  pariatur? '
      .'<a href="test">test<p></p></a><span>test<p></p>bla';

var_dump(StripUnclosedTags($str));

出力

string 'commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea
voluptate velit esse<br/> quam nihil molestiae consequatur, 
vel illum qui dolorem eum fugiat quo voluptas nulla 
pariatur? <a href="test">test<p></p></a>' (length=226)
于 2013-08-11T07:42:33.420 に答える