0

元気ですか?いきなり本題に入ります。

基本的に個々のまたはネストされた <blockquote> タグを削除する再帰的な正規表現を使用しています。プレーンな <blockquote> ... </blockquote> テキスト (ネストされているかどうかにかかわらず) を削除するだけで済み、これらの外側にあるものはすべて残します。

この正規表現は、私が望むとおりに正確に機能します(先読みと再帰の使用に注意してください)

$comment=preg_replace('#<blockquote>((?!(</?blockquote>)).|(?R))*</blockquote>#s',"",$comment);

しかし、大きな問題があります: $comment が大きい (3500 文字以上) と、Apache がクラッシュします (セグメンテーション違反だと思います)。

問題の解決策が必要ですが、クラッシュを解決するか、より良い正規表現を使用するか、同様に機能するカスタム関数を使用します。

ネストされた特定のタグを削除する方法についてアイデアがある場合は、歓迎します。

前もって感謝します

4

1 に答える 1

1

男、あなたのパターンは狂ったように sigfaults です! 数百バイトのコメントでもクラッシュしてしまいます。

preg_split() を使用して文字列を分割し、カウンターを使用してどれだけ深いかを追跡する方がはるかに簡単です。深さが 1 より大きい場合は、テキストを破棄します。実装は次のとおりです。

$tokens = preg_split('#(</?blockquote.*?>)#s', $comment, -1, PREG_SPLIT_DELIM_CAPTURE); 
$outsideTokens = array();
$depth = 0;
for($token = reset($tokens); $token !== false; $token = next($tokens)) { 
    if($depth == 0) {
        $outsideTokens[] = $token;
    }
    $delimiter = next($tokens);
    if($delimiter[1] == '/') {
        $depth--;
    } else {
        $depth++;
    }
}
$comment = implode($outsideTokens);

開始タグに属性が含まれている場合でも、コードは機能するはずです。

于 2012-08-11T00:38:13.313 に答える