我正在处理一份食谱配料清单,其中一个例子如下:
花生、小麦淀粉、植物油、变性淀粉、糖、孟买香料洋葱粉、草药和香料(孜然、咖喱粉、辣椒粉、香菜)、大蒜粉、氯化钾、酵母膏、酵母粉(含谷蛋白和大麦)、柠檬酸、调味料(含大麦、大豆、小麦、芹菜)、米粉、盐、色素(浓缩甜菜汁、姜黄素、木瓜提取物)。
我希望将每个成分分解成一个数组(使用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)我不太擅长RegEx语法,因此,如果有任何答案也可以解释语法逻辑,这将是非常值得赞赏的。
发布于 2012-12-10 15:43:46
这似乎有效(但也许这不是最好的解决方案):
preg_match_all('/\w[\w\s-]*(?:\[.*?\]|\(.*?\))?/', $string, $matches);它检查单词字符,后面跟着0或多个字符/空格/破折号(添加任何想要捕获的内容到这个组中),然后跟着.或(.)或者没有(但是不能嵌套相同类型的括号)。
所以你可以:
- something
- anything [...]
- something different (...)发布于 2012-12-10 15:42:32
啊,偏执-匹配不是正则表达式能轻易做到的。
也许您应该逐个字符地查看字符串:
$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-10 16:02:26
这个正则表达式似乎适用于您的示例。你不会爆炸,但它确实捕获了每个项目/组,然后你可以循环通过。
([\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 grouphttps://stackoverflow.com/questions/13803955
复制相似问题