2012-01-11 3 views
0

私は、一連の情報をキー値のペアの形式で格納し、クエリを使用して取得するPHPプロジェクトについて取り組んでいます。このプロジェクトでは、情報を取得するためのクエリは次のタイプです。PHPでクエリ(文字列)を解析する方法

(color: 'red' & size: 'small') | (color: 'yellow' & weight: 'heavy') 

このクエリは黄色またwheight重として赤色、また大きさとして小さな又は色として色を記述する私の記憶装置からの情報を選択することを示しています。一度このクエリを解析してユニットを抽出すると、mysqlクエリを作成し、データベースから必要な情報を取得します。

私は上記の文字列を解析して単位を取得する方法を知っています(私はそれが語彙単位であるかどうかわかりません)。私たちがカスタムパーサーを持つことができるライブラリがあれば、教えてください。

+0

正規表現を使用すると、文字列からデータを抽出できます。 –

答えて

0

積極的に維持されて固定されているPHPのために利用可能なライブラリがありません。あなたはYACCを使用することができ、BNFスタイルの文法定義を使用してカスタム言語用のCパーサーを取得できます。 PEAR(PHP_ParserGenerator)には1つありますが、それはもはや維持されていないことに注意してください。

hereから確認できます。

<rule>::=<rule>"|"<rule> | 
     <rule>"&"<rule> | 
     "("<rule>")" | 
     <attribute>":"<value> 
<attribute>::=[a-z0-9] 
<value>::="'"[a-z0-9]"'" 

しかし、あなたは、あなたがそれを見(トークンは、トークン)を閉じる対応だ遭遇し、再帰的にそのセクションを解析した後の解析では、十分に簡単に思える:あなたのパーサーの

BNFです。

0

表現したい条件は、非コンテキスト文法で形式化することができます。例:

attributeName := string 
attributeValue := ' string ' 
expression := (expression & expression) || 
       (expression | expression) || 
       attributeName : attributeValue 

ここで、文字列は一連の英数字として定義されているものとします。

この文法のパーサを書くことは、再帰関数を使うだけで簡単です。最も単純なケースでは、可能性のある一致をテストする文法の各プロダクション用の関数を記述したいと考えています。

条件がSoPとして「正規化」されている場合、正規表現は、& -clausesまたは| -clausesでのみ指定されるため、使用することもできます。

は最後に、私はPHP_ParseGeneratorという名前のパーサジェネレータを知っている: http://pear.php.net/package/PHP_ParserGenerator/redirected

関連する問題