0

わかりました、次のような文字列があります。

$disallowedBBC = 'abbr|acronym|anchor|bdo|black|blue|br|color|email|flash|font|ftp|glow|green|html|hr|img|iurl|li|list|ltr|url|quote';

そして、変数に従って許可されていないすべての bbc コードを取り除く必要がpreg_replaceある実際の文字列 (変数) より:$message$disallowedBBC

$message = preg_replace("/\[($disallowedBBC)[^]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message);

しかし、何らかの理由で、[hr]タグがこの preg_replace を通過しています。したがって、この場合は次のようになります。

$message = '[hr]Test';

タグを出力しますが、[hr]削除する必要があります。私の正規表現の何が問題になっていますか?

基本的...

すべての [hr] および/または [hr]Test[/hr] を完全に削除するように変更するにはどうすればよいですか? しかし、[url=http://someurl.com]Some Url[/url] のインスタンスも取り除く必要があります。[color=red]そして、次のように文字列から削除する必要があります。[color=red]Testing

たとえば[{tag}]、終了タグがある場合は削除する必要がありますが、終了タグ[/{tag}]がない場合は開始タグを削除する必要があり、その逆も同様です。次のように、括弧内にある {tag} 内のすべてをキャプチャできる必要があります。 [quote author=Solomon time=7834783470]Just a quote here[/quote] Additional text here...

したがって、これは次のように出力されます。 Just a quote here Additional text here...

4

1 に答える 1

0

2 つの preg_replaces が必要だと思います。1 つは最初に [hr]...[/hr] のペアを取り除き、次に残りの [hr]... を取り除きます。

$message = preg_replace("/\[($disallowedBBC)[^\]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message);
$message = preg_replace("/\[($disallowedBBC)[^\]]*]/is", "", $message);

ワンステップでやろうとすると、「abc[br]blahblah[hr]gak[/hr]def」のようなものが「abcdef」になります。大雑把な部分に制限を設けていただけると、できるかもしれません。

もちろん、配列構文を使用してこれらを 1 つの preg_replace 呼び出しに組み合わせることができます (ただし、順序が重要であることを忘れないでください)。

$patterns = array("/\[($disallowedBBC)[^\]]*](.*?)\[\/($disallowedBBC)\]/is",
                  "/\[($disallowedBBC)[^\]]*]/is", );
$replacements = array("$2", "");
$message = preg_replace($patterns, $replacements, $message);
于 2012-08-22T03:05:41.457 に答える