Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 匹配数量和单位的正则表达式_Php_Javascript_Regex - Fatal编程技术网

Php 匹配数量和单位的正则表达式

Php 匹配数量和单位的正则表达式,php,javascript,regex,Php,Javascript,Regex,我需要从这样的字符串中提取数量和单位 1 tbsp 1tbsp 300ml 300 ml 10grams 10 g 数量将始终是数字,然后可能有或可能没有一个空间,然后单位。它们可能是15-20个不同的单元,可以来自我们定义的一个数组列表 解决方案可以是javascript或PHP,因为我需要在将它们存储到数据库之前对它们进行拆分。它们需要分开存放 谢谢 编辑:很抱歉澄清。每一新行代表一个新字符串。也就是说,字符串只能包含10g或300ml,所以我们只需要一次拆分一个单位和一个数量 好的,您

我需要从这样的字符串中提取数量和单位

1 tbsp
1tbsp 
300ml
300 ml
10grams
10 g
数量将始终是数字,然后可能有或可能没有一个空间,然后单位。它们可能是15-20个不同的单元,可以来自我们定义的一个数组列表

解决方案可以是javascript或PHP,因为我需要在将它们存储到数据库之前对它们进行拆分。它们需要分开存放

谢谢


编辑:很抱歉澄清。每一新行代表一个新字符串。也就是说,字符串只能包含10g或300ml,所以我们只需要一次拆分一个单位和一个数量

好的,您可以创建一个允许的单元数组,然后使用应用于数组中的每个单元,这样,如果单元中有任何字符是正则表达式中的特殊字符,它们将被转义,然后构造正则表达式:

$units = array("tbsp", "ml", "g", "grams"); // add whatever other units are allowed
$pattern = '/^(\d+)\s*(' . join("|", array_map("preg_quote", $units)) . ')$/';
因此,$模式将变成类似/^\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;
  // ...
}
因为模式分别为数量和单位定义了两个捕获组,所以您可以从匹配中提取这些捕获组,并对它们执行您想要的操作


我已经根据问题更新了我的答案,即每一行都是一个单独的字符串。

好的,您可以创建一个允许的单位数组,然后使用来应用于数组中的每个单位,这样,如果单位中有任何字符是正则表达式中的特殊字符,它们将被转义,然后构造一个正则表达式:

$units = array("tbsp", "ml", "g", "grams"); // add whatever other units are allowed
$pattern = '/^(\d+)\s*(' . join("|", array_map("preg_quote", $units)) . ')$/';
因此,$模式将变成类似/^\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;
  // ...
}
因为模式分别为数量和单位定义了两个捕获组,所以您可以从匹配中提取这些捕获组,并对它们执行您想要的操作

我已经根据问题更新了我的答案,每一行都是一个单独的字符串。

Regex:

/(\d+)\s*(\D+)/
代码:

$数量和$单位为:

见:

如果你使用它,你不必准备一份单位清单。但这假设您的单位上没有数字字符,并且您的数量仅为数字。

Regex:

/(\d+)\s*(\D+)/
代码:

$数量和$单位为:

见:


如果你使用它,你不必准备一份单位清单。但这是假设你的单位上没有数字字符,你的数量只是数字。

也许简单点就够了,就像这样:

^([0-9]+)\s*([a-zA-Z]+)\s*$

也许简单的事情就足够了,就像这样:

^([0-9]+)\s*([a-zA-Z]+)\s*$


我想OP正在寻找更多关于这方面的信息,比如如何使用该模式提取匹配数组。@David真棒!我喜欢动态增加单位的能力。我想正则表达式有错误?代码中的模式与解释中的模式不同。$/vs/$。试图让它在我的ide中工作。但确实如此far@hookedonwinter哦,是的,那是个打字错误。^和$是线锚的开始和结束,斜杠是preg_*函数需要的模式字符的开始和结束。我想OP正在寻找更多关于这一点的信息,比如如何使用该模式提取匹配数组。@David真棒!我喜欢动态增加单位的能力。我想正则表达式有错误?代码中的模式与解释中的模式不同。$/vs/$。试图让它在我的ide中工作。但确实如此far@hookedonwinter哦,是的,那是个打字错误。^和$是线锚的开始和结束,斜杠是preg_*函数需要的模式字符的开始和结束。它们是否总是在这样的列表中?或者有时候会有其他的文字吗?@hookedonwinter-就他们自己。没有其他文本。它们总是在这样的列表中吗?或者有时候会有其他的文字吗?@hookedonwinter-就他们自己。没有其他文本。这些起始和结束锚定使匹配多行变得毫无用处。基本上,你是对的,但这也取决于实现。在c中,您可以定义RegexOptions.Multiline,它可以处理多行。例如,新的正则表达式@^[0-9]+\s*[a-zA-Z]+\s*$,RegexOptions。多行等价于新的正则表达式@[0-9]+\s*[a-zA-Z]+\s*@quantum:OP更新了问题,表示字符串将单独处理,而不是作为多行文本块处理,所以锚应该不是问题。你是说有锚的多行正则表达式和没有锚的非多行正则表达式是一样的吗?那是不对的。多行^[0-9]+\s*[a-zA-Z]+\s*$等价于?这些起始和结束锚点使匹配多行变得毫无用处基本上,您是对的,但这也取决于实现。在c中,您可以定义RegexOptions.Multiline,它可以处理多行。例如,新的正则表达式@^[0-9]+\s*[a-zA-Z]+\s*$,RegexOptions.Multiline是等效的
对于新正则表达式@[0-9]+\s*[a-zA-Z]+\s*@quantum:OP更新了问题,表示字符串将单独处理,而不是作为多行文本块处理,因此锚定不应该是问题。你是说带锚定的多行正则表达式与不带锚定的非多行正则表达式相同吗?那是不对的。多行^[0-9]+\s*[a-zA-Z]+\s*$等同于?