2011-12-25 13 views
2

私は試合は{}正規表現を置き換えるだけ内側に{}であれば

これとの間にある場合にのみ、大きな文字列内の別の文字に置き換えることができますどのように思ったんだけど:

bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok 

BLAのBLAのBLA%の{OKテキスト^^何}いくつかの{%以上}%のテキスト{はい^^ノーOK} OK:これに

文字と文字の間にスペースがあったため、{%more}は変更されませんでした。

大変ありがとうございます。

+4

? – SLaks

+0

regexbuddyソフトウェアを試してみてください。 –

答えて

3

{}もしをネストされていないと何も}はあなたのようなことを行うことができ、それらの外部で発生することはできません:文字列がある場合は

preg_replace('/%(?=\w[^{]*})/', '^^', $string); 

bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok { %foo %bar %baz } 

あなたはでしょう取得:

la % bla {ok text ^^nothing} some {% more} % text {yes ^^no ok} ok { ^^foo ^^bar ^^baz } 

ネストされた{}が許可されている場合は、あなたが使用できます。[^{]*が再帰的に任意のネストされた{}をチェックして([^{}]*+(?:{(?1)}[^{}]*+)*+)、置き換えられると、最初の一人として働く

%(?=\w([^{}]*+(?:{(?1)}[^{}]*+)*+)}) 

Example

$string = '%a { %a { %a } %a { { %a } %a } } %a { % %a } %a { %a }'; 
echo preg_replace('/%(?=\w([^{}]*+(?:{(?1)}[^{}]*+)*+)})/', '^^', $string); 

出力:括弧が入れ子になっている場合はどう

%a { ^^a { ^^a } ^^a { { ^^a } ^^a } } %a { % ^^a } %a { ^^a } 
+0

この回答はあまり複雑ではありません。ルックアヘッドの活用。 –

+0

の使用について不思議です: '[^ {]'なぜ必要ですか? –

+0

@Tobi、私がやっていることは、現在の '%\ w'のあとに' {'を入れずに'} 'があることを確認することだけです。 – Qtax

4
$str = 'bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok'; 
$str = preg_replace('/(\{[^}]*)%(\w[^}]*)/', '$1^^$2', $str); 
// bla bla % bla {ok text ^^nothing} some {% more} % text {yes ^^no ok} ok 
+2

'{}'ごとに1つの '%foo'に対してのみ動作します。 – Qtax