2011-06-18 3 views
1

私はregexを使用してデータを抽出できるパーサを構築しようとしています。私はここで任意の後方参照を使用して、引用符で囲まれた文字列をキャプチャすることができます

と一致することができるようにしたい

は、私が今持っているものです。

(\w+)\s+('|")([^\2\\]*(\\.[^\2\\]*)*)\2\s*; 

([^\2\\]*(\\.[^\2\\]*)*)部分は残念ながら私はこのパターンを持つ2つの問題を抱えているhttp://ad.hominem.org/log/2005/05/quoted_strings.php

から取られました。

まず、一重引用符で囲まれていない文字列をキャプチャしたいと考えています。

print "hello world";があるが、print foobar;は機能しません。私は最後に逆参照をオプションで\2にすることができませんでした。

さらに、私は正規表現を囲んでいるかどうかわかりませんが、このパターンの複数のインスタンスを解析することはできないようです。

print 'hello'; print 'foobar';で正規表現を試してみると、最初のprint 'hello';部分が返されます。

ご協力いただきありがとうございます。私は彼らのパラメータを持つすべてのアクションをキャプチャしようとしています

listen   80; 
server_name  domain.com *.domain.com; 
rewrite^  http://www.domain.com$request_uri? permanent; 

編集ここ

は、私が解析しようとしているものの抜粋です。基本的には、NGINX設定ファイルを解析することはできません。http://wiki.nginx.org/FullExample

+0

あなたは何と一致しますか? – Halcyon

+0

あなたの目標はPHP文字列を解析することですか? –

+1

これは野生の推測ですが、 '( '|") 'から'(' | "|)'に変更することはできませんか? – Halcyon

答えて

2

逆参照doesn't workの文字クラス[^\2]のようなものです。それは複数文字の文字列であり、そこでは使用できません。 ((?!\2).)*構造を使用して回避することができます。しかし、マッチパターンを単純化すれば、それは本当に簡単になります。

最も簡単な方法は、ここでは別に三つの可能な選択肢の一覧を表示するために、次のようになります。

明らか
/(\w+)\s+ (?: '([^']*)' | "([^"]*)" | (\S+)) \s*;/x 

あなたは、結果セットから結果を取得する必要があります[2]、[3]または[4]手動。

+0

それは素晴らしい作品です。ありがとう!私は本当に正規表現であまりにも多くの経験を持っていないし、逆参照に触れる私の最初の時間だった。 – Caissy

1

複数回一致させたい場合は、代わりにpreg_match_allを使用してください。一致する文字列が重複しない限り、すべての文字列を取得します。

+0

いいえ、正しく動作していないようです。 – Caissy

+0

スクリプトを投稿できますか? – Halcyon

+0

まだスクリプトがありません。 – Caissy

関連する問題