2011-02-02 6 views
0

PHP CurlでASP/VBScript設定ファイルを取得してファイル処理を行い、いくつかの値を返す必要があります。異なるフォーマットの名前と値のペアを一致させるための正規表現が必要

config1 = "" 
config2 = "VALUE:1:0:9" 'strange value comment 
otherconfig = False 
yetanotherconfig = False 'some comment 

は基本的に、その名前と値のペアは、任意コメントによって任意に続く引用符で囲まれた値と、等号で区切られた:

文字列は次のように見えます。

私は実際の値を返すようにしたい

(偽、VALUE:1:9、等..:0)ここで私が渡している模様だかかわらず、文字列の中にあるフォーマットのONE一致するグループに

。これまでにするpreg_matchする:

$pattern = '/\s*'.$configname.'\s*\=\s*(\".*?\"|.*?\r)/' 

の$のconfignameは、私が探している特定の構成の名前ですので、私は、変数とそれを渡します。

私はまだ括弧が(値自体の代わりに)値とともに戻ってきていますが、値を返すコメントも出ています。

ご協力いただきましてありがとうございます。

+0

function parse_config($string) { $pattern = '/ \s* # name (?P<name>.*?) # = \s*=\s* # value (?P<val> "(?P<quoted>([^"]|\\\\"|\\\\\\\\)*)" |(?P<raw>.*?) ) # comment \s*(?P<comment>\'.*)? $/xm'; preg_match_all($pattern, $string, $matches, PREG_SET_ORDER); $config = array(); foreach($matches as $match) { $name = $match['name']; if (!empty($match['quoted'])) { $value = str_replace(array('\\"','\\\\'), array('"','\\'), $match['quoted']); } else if (isset($match['raw'])) { $value = $match['raw']; } else { $value = ''; } $config[$name] = $value; } return $config; } 

例:

$string = "a = b\n c=\"d\\\"e\\\\fgh\" ' comment"; $config = parse_config($string); // output: array('a' => 'b', 'c' => 'd"e\fgh'); 

他の例

は、このような機能でそれを使用してください。 – BoltClock

+0

申し訳ありません引用符..! – tresstylez

答えて

1

二重引用符の代わりに1つのマッチンググループで一致する値を返すのが難しい場合。後ろの参照は助けることができます:

$pattern = '/\s*'.$configname.'\s*=\s*("?)(?<value>.*?)\1\s*[\'$]/' 

トリックを行う必要があります。次に、$result['value']を使用します。 Iスペース識別子スペースをスキップ

  • =スペース(容易)
  • が\ 1(第一の捕捉括弧)
  • 一致する文字として参照"と一致することができる:

    はそれがない英語で説明しました欲張って参照されていない

  • valueとしてマッチ\ 1(そう"前のもの、または何もない場合があった場合)
  • は、いくつかのと一致してペース
  • は後方参照なしの開始コメント'またはライン

の終わりと一致しなければなりません:

$pattern = '/\s*'.$configname.'\s*=\s*(?:"(.*?)"|(.*?)\s*[\'$])/' 

より効率的なのが、値が$result[1]$result[2]です。

あなたの過ちを理解する:

  • あなたが唯一の文字列の引用符自体(ここでは簡単な引用符)を保護するか(... $^.として)解釈するプリプレグ予約文字を避けるために\が必要ラインの
  • エンドはあなたはコメントを避けたことがない
  • Rまたは\を\ nではない、$としてマークされ
+0

'preg_quotes()'を忘れましたか? :-) – arnaud576875

+0

堅牢性を向上させる '$ configname'について? – Pierre

0

\ rは、CR文字(復帰)に一致する予定です。 あなたは本質的に私が "???????"または[かろうじて]

あなたはアポストロフィを得るでしょう、あなたはそれに合っています。 これを取り除く必要があります。

patter = '/\s*'.$configname.'\s*\=\s*(\")(.*?)(?(1)\"|)\s*/'

0

この1つは動作します:

$pattern = '/ 
    \s* 
    # name 
    (?P<name>.*?) 
    # = 
    \s*=\s* 
    # value 
    (?P<val> 
     "(?P<quoted>([^"]|\\\\"|\\\\\\\\)*)" 
     |(?P<raw>.*?) 
    ) 
    # comment 
    \s*(?P<comment>\'.*)? 
$/xm'; 

これは、入力文字列内のすべてのキーと値のペアを一致するのではなく、単に特定のものを。

正規表現は、引用符で囲まれた値(\")を引用符で囲んだ値(例:"foo\"bar")に注意します。私はあなたの設定、試料中の任意の括弧が表示されない

$string = <<<EOF 
config1 = "" 
config2 = "VALUE:1:0:9" 'strange value comment 
otherconfig = False 
yetanotherconfig = False 'some comment 
EOF; 

print_r(parse_config($string)); 

// output: 

Array 
(
    [config1] => 
    [config2] => VALUE:1:0:9 
    [otherconfig] => False 
    [yetanotherconfig] => False 
) 
関連する問題