2

我正在处理一个配方成分列表,其中一个示例如下所示:

花生、小麦淀粉、植物油、改性淀粉、糖、孟买香料味 [洋葱粉、香草和香料(孜然、咖喱粉、辣椒粉、芫荽)、大蒜粉、氯化钾、酵母提取物、酵母粉(含有麸质和大麦)、柠檬酸、调味剂(含有大麦、大豆、小麦、芹菜)]、米粉、盐、色素(浓缩甜菜根汁、姜黄素、辣椒粉提取物)。

我希望将每种成分分解成一个数组(使用 PHP),用逗号分隔。我遇到的问题是某些成分被细分了。在此示例中,“Mumbai Spice Flavour”的成分由方括号分隔,并包含一些成分,然后由常规括号分隔子成分。

一个标准:

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)

我不太擅长 RegEx 语法,因此如果有任何答案也可以解释语法逻辑,我将不胜感激。

4

3 回答 3

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 回答
1

这似乎有效(但也许这不是最好的解决方案):)

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

它正在检查单词字符后跟 0 个或多个字符/空格/破折号(将您想要捕获的任何内容添加到该组),然后是 [...] 或 (...) 或什么都没有(但相同类型的括号不能嵌套

所以你可以拥有:

- something
- anything [...]
- something different (...)
于 2012-12-10T15:43:46.337 回答
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 回答