Хорошо, вы можете создать массив разрешенных единиц, а затем использовать 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;
// ...
}
Поскольку шаблон определяет две группы захвата, соответственно для количества и единицы, вы можете извлечь их из соответствия и сделать с ними то, что хотите.
(я обновил свой ответ, основываясь на обновлении вопроса о том, что каждая строка представляет собой отдельную строку).