2016-08-25 7 views
2

私は正規表現(PHP)の助けが必要です。だから私はユーザーが注文を入力できるテキストエリアのボックスを持っています。Regex help(php)

例えば

:各順序は、順序はどちらかである(最後の1

  • 除いて、カンマで区切られ

    • :私は、次のルールに一致する正規表現を必要とする

      see north, 
      see south, 
      sell 7 wood, 
      see west 
      

      北を見る、南を見る、西を見る、東を見る)または(木材を買う/売る)。 % - を表す数(最大値は999で、最小値はありませんヘッドゼロと1である)

    これまでのところ、私はこの正規表現作られています

    preg_match("/(((see) (north|south|west|east))|((sell|buy) ([1-9][0-9]{0,2}) (wood)))/"); 
    

    をしかし、問題は、以下の入力も有効であり、 、これはありませんする必要があります: は75木材は北参照売る

    NB(それはどちらか OR は北参照75木材を販売する必要があります)!私はPHP関数を使ってコンマで分割し、その結果の配列項目を正規表現に渡すので、私は正規表現にコンマの検証をしていません。しかし、それは次の入力で動作していないよう:だから

    see north, 
    see south  *(no comma between two orders)* 
    sell 7 wood, 
    see west 
    

    、私は次のソリューションのいずれかが必要:

    • 正規表現(ルールを参照)
    • 私が爆発コンマ検証を持っています入力された文字列はPHPの関数を破棄し、次の入力が無効であることを制限します:north 75 see wood north

    ありがとうございました。

  • +0

    あなたの#2 - あなたの#2 - 使用する[アンカー](http://www.regular-expressions.info/anchors.html)のように '^(?: see(?:北、南、西、東)|(?:sell | buy)[1-9] [0-9] {0,2} wood)$ ' –

    +0

    あなたのパターンは、テストストリング - そのため、南に7木材を売ってください "と答えた方が良い結果を得ました。 – CBroe

    +0

    ありがとうございました。しかし、私はいくつかのユニットテストを書いて、それが何をすべきかを確かめる必要があります。そして、もちろん、私は正規表現を詳しく見ていきます。あなたの答えをありがとう! – Omaja7

    答えて

    1

    正規表現を使用しないでください。これは(基本的な)パーサーの仕事です。

    一度に1つのコマンドを取得する必要があれば何でもしてください。例えば、explodeとすることができます。必要に応じてtrimを使用して、先頭と末尾の空白を削除します。その後

    $parts = explode(" ",$command);

    あなたは今switch($parts[0])最初のキーワードに基づいて行うべきかを判断することができます。

    case "see": 
        if(!in_array($parts[1], ["north","south","east","west"])) { 
         throw new OutOfBoundsException("Invalid direction"); 
        } 
        // do something here 
        break; 
    

    検証は超簡単で、ユーザーは、彼らが間違っていたかを知っているように、それは特定のエラーメッセージを提供することができますどのように注意してください。

    case "sell": 
        $q = intval($parts[1]); 
        if($q < 1 || $q > 999) { 
         throw new OutOfBoundsException("Invalid amount of things to sell"); 
        } 
        $what = $parts[2]; 
        if(!in_array($what, ["wood"])) { 
         throw new OutOfBoundsException("Invalid thing to sell"); 
        } 
        // do something 
        break; 
    
    default: 
        throw new OutOfBoundsException("Invalid command"); 
    

    このプロセス全体は、大きな問題を抱えて分解することです。また、どのように動作するか、どのコマンドとパラメータが許可されているかなど、非常に簡単に変更できます。正規表現を変更するのはずっと難しくなります。

    +0

    私はこのアプローチも好きです。問題は、時々私はオプションに圧倒され、特定の問題を解決する方法と私は何が最善の方法であるか分からない。 – Omaja7