2

私はレシピの材料のリストを処理しています。その例は次のようになります。

ピーナッツ、小麦澱粉、植物油、変性澱粉、砂糖、ムンバイスパイスフレーバー[オニオンパウダー、ハーブとスパイス(クミン、カレー粉、チリパウダー、コリアンダー)、ガーリックパウダー、塩化カリウム、酵母エキス、酵母パウダー(グルテンと大麦)、クエン酸、香料(大麦、大豆、小麦、セロリを含む)]、米粉、塩、色(濃縮ビートルートジュース、クルクミン、パプリカエキス)。

各成分をコンマで区切った配列(PHPを使用)に分解したいと思います。私が抱えている問題は、いくつかの成分が細分化されていることです。この例では、「ムンバイスパイスフレーバー」のコンポーネントは角かっこで区切られ、いくつかの材料が含まれています。副成分は通常の角かっこで区切られています。

標準:

explode(",", $recipeStr) 

非常に厄介な結果が得られるので、オプションの角かっことオプションのサブかっこを考慮して、各個別の要素を配列に分解する正規表現ステートメントを探しています。また、角かっこ内にネストされていない角かっこを処理できる必要があります。

望ましい結果は、次のような配列リストになります。

-Peanuts
-Wheat Starch
-Vegetable Oil
-Modified Starch
-Sugar
-Mumbai Spice Flavour [Onion Powder, Herbs and Spices (Cumin, Curry Powder, Chilli Powder, Coriander), Garlic Powder, Potassium Chloride, Yeast Extract, Yeast Powder (contains Gluten and Barley), Citric Acid, Flavouring (contains Barley, Soya, Wheat, Celery)]
-Rice Flour
-Salt
-Colours (Concentrated Beetroot Juice, Curcumin, Paprika Extract)

私は正規表現の構文があまり得意ではないので、もし答えがあれば構文ロジックを説明していただければ幸いです。

4

3 に答える 3

1

これはうまくいくようです(しかし、おそらくそれは最善の解決策ではありません):)

preg_match_all('/\w[\w\s-]*(?:\[.*?\]|\(.*?\))?/', $string, $matches);

単語の文字に続いて0個以上の文字/スペース/ダッシュ(このグループにキャプチャしたいものを追加)が続き、[...]または(...)または何も続かない(ただし同じタイプの角かっこ)ネストできません

だからあなたは持つことができます:

- something
- anything [...]
- something different (...)
于 2012-12-10T15:43:46.337 に答える
1

ああ、括弧の一致は、正規表現で簡単にできることではありません。

おそらく、文字列を文字ごとに単純に調べる必要があります。

$array = new Array();
$temp = "";

for($i = 0; $i < strlen($input); $i++)
{
    $c = $input[$i];
    if($c == '(')
        $paranthesis++;
    if($c == '[')
        $bracket++;

    if($c == ')')
        $paranthesis--;
    if($c == ']')
        $bracket--;
    if($c == ',' && $paranthesis + $bracket == 0)
    {
        $array[] = $temp;
        $temp = "";
    }
    else
        $temp .= $c;
}
$array[] = $temp;

私はコードをテストしませんでしたが、それが何をすべきかが明確であることを願っています。

于 2012-12-10T15:42:32.467 に答える
0

この正規表現はあなたの例でうまくいくようです。爆発することはできませんが、ループできる各アイテム/グループをキャプチャします

([\w+ ]+\[[^\]]+\]|[\w+ ]+\([^\)]+\)|[\w+ ]+)

ここでデモを見る

それを分解するには:

(                      start capture group
[\w+ ]+\[[^\]]+\]    match any words followed by [...]
|                      or
[\w+ ]+\([^\)]+\)    match any words followed by (...)
|                      or
[\w+ ]+              match any other words
)                      end capture group
于 2012-12-10T16:02:26.193 に答える