2012-03-31 14 views
2

大括弧で囲んだテキストのすべてのインスタンスを別のものに置き換える必要があります。各角括弧のブロックは別々に扱われます。正規表現マッチングの構文

[quote author=joe link=topic=765.msg4476#msg4476 date=1330380346] This is the quoted text [/quote] This is the new post

に回転される

:例えば、で始まる

** This is the quoted text ** This is the new post

私は、次を使用してみました:

preg_replace('/\[.*\]/', '**', $msgtext); 

私は何を得ることである:

** This is the new post

大文字の括弧で区切られた複数のブロックがあっても、文字列全体の最初の[['文字]から最後の'] '文字までは一致しているようです。正規表現を変更して角括弧の中の各ブロックを個別に置き換えるにはどうすればよいですか?明らかに私の。*正規表現では、最後のものまで右括弧を含むすべてのものがマッチしていますが、最初の右括弧で停止してから、その論理を文字列全体にわたって繰り返す必要があります。デフォルトでは

答えて

4

ungreedyにこれを設定する必要があり、貪欲なマッチングを行います

preg_replace('/\[.*\]/U', '**', $msgtext); 

または.*?(「ゼロ以上であり、好ましくはできるだけ少ないなど」)の代わりに.*(「ゼロ以上、および、好ましくなどの多くを使用して:貪欲全体のパターンを作るため/Uフラグ可能性 "):

preg_replace('/\[.*?\]/', '**', $msgtext); 

また、あなたが[^\]](使用できる" 改行以外の任意の文字 " "ではなく.(の)" ]以外の任意の文字):

preg_replace('/\[[^\]]*\]/', '**', $msgtext); 
+0

ありがとうございました、上記のすべてが魅力的でした。私はバージョン以外のキャラクターを使用しましたが、貪欲でない人も同様に働き、同じ結果を得ました。解決済み。 –

+0

@BenCahanあなたの質問に答えたと思われる場合は、投票の下にあるチェックマークをクリックして回答を受け入れる必要があります。 – cmbuckley

1

、PHPの正規表現を使用すると、(Uスイッチを使用することによって)あなたが使用するか、非貪欲試合を使用する必要が

preg_replace('/\[.*\]/U', '**', $msgtext); 
1

をこれが私の作品:

preg_replace('/\[[^\]]*\]/', '**', $msgtext); 
+0

おっと!投稿した直後のruakh 3番目の答えは同じです。私はそれに投票する – sdjuan