2009-06-26 10 views
0

私が使っていた正規表現が正規表現を「スワロー」しないようにするにはどうすればよいですか?

$regex = '/\{([a-z]+?)\}(.+?)\{/i'; 

これはしかし、最後のブレース{それツバメことで問題を引き起こし、それが「勝ったので

{word} definition 
{another word} another definition {word} they don't have to be on different lines 

のようなテキストファイルを持っています次の単語の次の{と一致する。実証するために

、私はここでの目的

echo preg_replace($regex, '<b style="background-color: red;">$1</b><b style="background-color: yellow;">$2</b>', $content); 

をデバッグするためにこれをやった(したがって、それが正規表現にマッチしていない、次のワードで開くブレースがない注意)私の出力の一例です

<b style="background-color: red;">shrub</b><b style="background-color: yellow;"> Multi stemmed woody plant</b>Abaxial} side or face away from the axis 

これを動作させるにはどうすれば正規表現を修正できますか?

EDITあなたの答えのための

多くの感謝をいただき、ありがとうございます。正規表現を変更しました

$regex = '/\{([a-z\-\s]+?)\}([^\{]+)/i'; 

また、先読み記事も調べます。

答えて

7

この特定のケースでは、あなたが行うことができます:

$regex = '/\{([a-z]+?)\}([^\{]+)/i'; 

[^\{]

は "左中括弧ではない任意の文字に一致する" という意味します。これには、入力の最後に {を必要としないという利点もあります。

より一般的には、先読みアサーションは、他にも言及したように使用できます。

2

文字をキャプチャせずに検索するには、Look Ahead機能を使用することをお勧めします。

あなたは正規表現を再構成することができます。

$regex = '/\{([a-z]+?)\}(.+?)(?={)'; 
2

あなたはそうのように、代わりに中括弧が続く.+の唯一の非中括弧の文字に一致するように最後の部分を変更することができます:

$regex = '/\{([a-z]+?)\}([^{]+)/i'; 
関連する問題