2016-05-15 14 views
0

これで、PHPでいろいろな正規表現を試してみることにしました。私はこのような文字列を持っています:PHP Regex:エスケープされていない文字グループを一致させる

$str = "this is a(n) {item} made by {username}. Watch out for \\{escaped} items. This one is \\\\{notescaped}."; 

中括弧で囲まれた非エスケープグループをキャプチャする必要があります。私はグループ(中括弧を含む)の文字列をpreg_splitを使って配列に分割し、必要な情報を後で空白に記入することを計画しています。

だからこの結果は次のようになります。

// After preg_split 
array (
    [0] => "this is a(n) ", 
    [1] => " made by ", 
    [2] => ". Watch out for {escaped} items. This one is \\", 
    [3] => "." 
); 

// Captured delimiters from preg_split 
array(
    [0] => "{item}", 
    [1] => "{username}", 
    [2] => "{notescaped}", 
); 

私は単に基本的な\{.*\}を使用してグループをキャプチャする方法を知っているが、私はそれがエスケープされていなかったことを確認する必要があります。だから、\\\\\\{escaped}(3つのバックスラッシュ)のようなものはまだそれをエスケープするでしょう。また中括弧の中の文字は、任意の文字、特定のもの、エスケープのためにチェックする必要のないものにすることができます。これについての助けがあれば幸いです!

答えて

1

バックスラッシュはで動作するように痛みですが、これは「エスケープ」の間にすべてを見つけるでしょうブレース:文字列として

(?<=^|[^\\])(?:[\\]{4})*[{]([^}]*)[}] 

、それはこの怪物次のようになります。基本的に

$re = "~(?<=^|[^\\\\])(?:[\\\\]{4})*[{]([^}]*)[}]~s"; 

、それが確実にブラケットの前に偶数のバックスラッシュがあることを確認します。

+0

これはほとんどそれです!私はちょうどいくつかの問題を抱えています。テキストの最初の項目が '' {これ}は一致しません」のようなグループであり、テキストの間にスペースがあれば一致しないようですそして中括弧は空白になります。 ''いくつかの{item} "=> [" some "、" item "]'です。 –

+0

@DavidLudwigが修正されました。バックスラッシュまたは文字列の先頭のいずれかに正の外観を使用するようになりました。 – Laurel

+0

それは、それほどありがとう! –

関連する問題