2012-12-10 41 views
2

我处理配方成分的列表,它的一个例子是这样的:正则表达式语法爆炸配方列表元素

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

我希望将每种成分分解成数组(使用PHP),用逗号分隔。我的问题是一些成分被细分。在这个例子中,'Mumbai Spice Flavor'的组成部分用方括号分隔,并且包含一些成分,然后子成分被定期括号分隔。

标准:

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) 

我不是在正则表达式的语法非常好,因此,如果任何问题的答案也可以说明,将不胜感激的语法逻辑。

回答

2

这似乎是工作(但也许它不是最好的解决方案):)

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

它检查单词字符后跟0个或多个字符/空间/破折号(添加任何你想捕捉到这个组),然后依次或者通过[...]或(...)或没有(但同一类型的括号不能嵌套

所以,你可以有:

- something 
- anything [...] 
- something different (...) 
+0

这是非常好的,看起来正是我想要的输入列表。非常感谢你! :) – monkeymatrix

1

啊,paranthesis-匹配不是一个正则表达式可以轻松做到的。

也许你应该去简单地通过串逐个字符:

$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; 

我没有测试的代码,但我希望这是明确什么是应该做的。

+0

做paranthesis匹配在正则表达式中,你只需要逃避它们。 – Naryl

+0

谢谢你的回答。我确实看到它在做什么(如果我不知道RegEx是否存在,这可能是我会做的),但我发现接受的答案是一个更优雅和更好的解决方案。在这个有限的子集中,是的,是 – monkeymatrix

+1

。但是正则表达式不能正确地验证所有的括号术语,如((())())或()()(()())等等(我的代码被愚弄了,在某些情况下也会失败,但这个概念是如果你想完全验证这些条款,也是一样) –

1

此正则表达式似乎工作在你的榜样上,你将无法爆炸,但它确实抓住每一个项目/组,然后您可以遍历

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

demo here

进行分解:

(      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 
+0

这个解释很棒。非常感谢! – monkeymatrix