1

いくつかの理由で、次の不適切にネストされた BBcode を取得しました

[url=] こんにちは [url=] 世界 [/url][/url]

ネストされた url タグを削除したいだけです。結果は次のようになります: [url=] Hello world [/url]

私は非常に長い記事を持っていますが、これは何度も起こります。これに関する提案はありますか?


ネストされたタグを削除する方法は、このような 1 つの記事で何度も発生しました

[url=] こんにちは [url=] 世界 [/url][/url] [url=] こんにちは [url=] 世界 [/url][/url] [url=] こんにちは [url=] 世界 [/url] [/URL]

ありがとう!

4

2 に答える 2

1

次のテスト済みスクリプトは、そのトリックを実行する必要があります。再帰的な正規表現と の再帰的なアプリケーションを使用しますpreg_replace_callback()。ネストされたレベルの URL タグを処理し、最も外側のタグを除くすべてを取り除きます。

<?php // test.php 20110325_1500
$re_url = '%# Match outermost [URL=...]...[/URL] (may have nested URL tags
    (\[URL\b[^[\]]*+\])       # $1: opening URL tag.
    (                         # $2: Contents of URL tag.
      (?:                     # Group of contents alternatives.
        (?:(?!\[/?URL\b).)++  # One or more non-"[URL", non-"[/URL"
      | (?R)                  # Or recursively match nested [URL]..[/URL].
      )*+                     # Zero or more contents alternatives.
    )                         # End $2: Contents of URL tag.
    (\[/URL\s*+\])            # $3: Outermost closing [/URL]
    %six';
function strip_nested_url_tags($text) {
    global $re_url;
    $return = '_handle_url_callback';
    return preg_replace_callback($re_url, $return, $text);
}
function _handle_url_callback($matches) {
    global $re_url;
    static $depth = 0;
    $depth++;
    $return = '_handle_url_callback';
    $matches[2] = preg_replace_callback($re_url, $return, $matches[2]);
    if ($matches[2] === NULL)
    { // On error, preg_replace_callback returns NULL.
        exit('Error - Message is too long or too complex.');
    }
    if (--$depth > 0) return $matches[2];
    return $matches[1] . $matches[2] . $matches[3];
}
$data = file_get_contents('testdata.html');
$data = strip_nested_url_tags($data);
file_put_contents('testdata_out.html', $data);
?>
于 2011-03-25T22:30:42.583 に答える
0

これはうまくいくかもしれません:

$string = preg_replace("/(\[url=[^\]]*\].*)\[url=[^\]]*\](.*)\[\/url\](.*\[\/url\])/is", "$1$2$3", $string);

ただし、元に戻そうとするのではなく、問題の根本を見つける必要があります。

于 2011-03-25T21:11:43.337 に答える