2011-08-12 12 views
3

私は、コマンドタグの値を取得したい:(PHP)解析コマンド

// My command 
$_cmd = 'GET a, b FROM p IN a and c="I am from Sarajevo" or d>1 '; 

// My parser 
if(preg_match_all('/(GET|FROM|IN)\s+([^\s]+)/si',$_cmd, $m)) 
    $cmd = array_combine($m[1], $m[2]); 

出力:私は探しています

Array 
(
    [GET] => a, 
    [FROM] => p 
    [IN] => a 
    [from] => Sarajevo" 
) 

をこの出力:

Array 
(
    [GET] => a, b 
    [FROM] => p 
    [IN] => a and c="I am from Sarajevo" or d>1 
) 

見ての通り、問題は空白繰り返さCであります文字列にというタグが付いています(fromなど)。どうすればこのコマンドを解析できますか?

+2

:あなたに興味を持っている条項は、その後のトークンを(私はあなたのユースケースについて混乱していても)再マージあなたが唯一のものであることを確認することができます'から'ではなく 'FROM'を数えますか? 'IN'に大文字の' from'という文字列が含まれるシナリオがありますか? – ninetwozero

+0

私はそれがSQLに関係していると思います...単純にSQLを使用します。そのためのインターフェイスを開発しようとしないでください。 – Dor

+0

@Dor - 助言SQLパーサーはしないでください。私は私のORMプロジェクトのためにこれを解析する必要があります。 – dino

答えて

8

後に空白whith FROMかでは、GETが続いていないキーワードの後に​​任意の文字を見つけます。

preg_match_all('/\w+|".*?"|\W/', $_cmd = 'GET a, b FROM p IN a and c="I am from Sarajevo" or d>1 ', $list); 

これはあなたがちょうど見つけなければならない単純なリストを与える:(。それはなんとかますが、単純ではない)

あなたは正規表現が再び有効なツールとなり、単純なトークナイザを使用する必要がありますあなたはないだろう - あなたは `/ i`-修飾子を省略した場合にどのような

[0] => Array 
    (
     [0] => GET 
     [1] => a 
     [2] => , 
     [3] => b 
     [4] => FROM 
     [5] => p 
     [6] => IN 
     [7] => a 
     [8] => and 
     [9] => c 
     [10] => = 
     [11] => "I am from Sarajevo" 
     [12] => or 
     [13] => d 
     [14] => > 
     [15] => 1 
    ) 
+0

各項目の後に空白があります。あなたのコードをもう一度確認できますか?私が間違っている? – dino

+2

スペースを削除するには '\ W 'の代わりに'(?!\ s)\ W'を使うことができます。結果のパーツをマージする場合は、スペースを残す必要があります。 (そのため、私はそのオプションをもう一度無効にしたのです)。 - トークナイザとして必要なのか、文字列の部分を分割するのか、本当に依存します。 – mario

+0

正規表現を使用せずにこれを行うことができますか? – dino

1

このためにスクリプト言語を開発する必要があります。正規表現はこれらの目的には適していません。

+0

Regexを使わないであなたの解決策は? – dino

+0

@dino beytar:あなたはRegexを使うことができますが、それはソリューションの主要部分ではありません。インタプリタを開発する(または利用可能なFOSSを使用する)必要があります:http://en.wikipedia.org/wiki/Interpreter_%28computing%29 – Dor

+0

あなたは、PHPを使わずにインタプリタを開発したり使うべきであることを意味しました。私はすでに通訳を開発しようとしていますか? – dino

1

デリミタ/の後には、大文字と小文字を区別しないiを削除できます。また、キーワードの後に​​少なくとも1つの空白があることを確認してください。

+3

''私がサラエボから来たのか、それともd> 1 ''なのか? – Dor

3
if(preg_match_all('/(GET|FROM|IN)(.(?!(GET|FROM|IN)))+\s*/si',$_cmd, $m)) 

これは意味 - あなたは簡単に、単一の正規表現でそれを解析することはできませんそれ

+0

しかし、GETの後にFROM ?!私はアイデアを参照してください、しかしそれは動作しますか? – powtac

+0

?!意味はありません – SergeS

+0

いいえ、後でFROMが続きます... – powtac

1
$_cmd = 'GET a, b FROM p IN a and c="I am from Sarajevo" or d>1 '; 
$tpar = preg_split('/\s+(GET|FROM|IN)\s+/i', ' '.$_cmd.' ', -1, PREG_SPLIT_DELIM_CAPTURE); 
array_walk($tpar, 'trim'); 

print_r($tpar); 

// gives: 
array(
    [0] => GET 
    [1] => a, b 
    [2] => FROM 
    [3] => p 
    [4] => IN 
    [5] => a and c="I am from Sarajevo" or d>1 
) 
// the rest is straight forward 
+0

上記の出力と同じではありません。あなたのコードには何か問題があると思いますか?私が間違っている? – dino

+1

はい、私は引用符の中の "フォーム"を見逃しました、私はPHPボックスなしでanwseringです。 –