我需要从像这样的字符串中提取数量和单位
1 tbsp
1tbsp
300ml
300 ml
10grams
10 g
数量永远是数字,那么单位可能有也可能没有空格。它们可能是15到20个不同的单位,可以来自我们定义的列表(可能是数组)
解决方案可以是javascript或PHP,因为我需要在将它们存储到数据库之前将它们拆分。即它们需要分开存放。
由于
编辑:很抱歉要清楚。每个新行代表一个新字符串。那就是字符串只包含10g OR 300ml - 所以我们只需要一次拆分一个单位和一个数量。答案 0 :(得分:4)
好的,你可以做的是创建一个允许的单元数组,然后使用array_map
在数组中的每个单元上应用preg_quote
(这样如果单元中有任何字符,是正则表达式中的特殊字符,它们将被转义),然后构造正则表达式:
$units = array("tbsp", "ml", "g", "grams"); // add whatever other units are allowed
$pattern = '/^(\d+)\s*(' . join("|", array_map("preg_quote", $units)) . ')$/';
$pattern
因此会变成/^(\d+)\s*(tbsp|ml|g|grams)$/
,然后您可以使用它来检测字符串中的单位内容:
$matches = array();
// assuming you have an array of measurement strings...
foreach ($measurement_strings as $measurement)
{
preg_match($pattern, $measurement, $matches);
list(, $quantity, $unit) = $matches;
// ...
}
因为模式定义了两个捕获组,分别为数量和单位,然后你可以从匹配中提取它们并用它们做你想要的。
(我根据问题更新更新了我的答案,每行都是一个单独的字符串。)
答案 1 :(得分:4)
正则表达式:
/(\d+)\s*(\D+)/
代码:
preg_match_all('/(\d+)\s*(\D+)/', $ingredients, $m);
$quantities = $m[1];
$units = array_map('trim', $m[2]);
$quantities
和$units
是:
Array
(
[0] => 1
[1] => 1
[2] => 300
[3] => 300
[4] => 10
[5] => 10
)
Array
(
[0] => tbsp
[1] => tbsp
[2] => ml
[3] => ml
[4] => grams
[5] => g
)
如果使用此功能,则无需准备好单位列表。但这假设您的单位上没有数字字符,而您的数量仅为数字。
答案 2 :(得分:2)
Mabye简单就足够了,就像那样:
^([0-9]+)\s*([a-zA-Z]+)\s*$