我是一个PHP的完全初学者。我有几百种产品描述,例如:
我需要从产品名称中提取出风味、数量和重量的名称如下:
例如,:
来自:超级优质猫粮牛肉42 x 85克
对此:
我试着使用数组,但它对我根本不起作用。
数字太乱了。有时10公斤,有时10公斤,有一个缺口,你可以在上面的例子中看到。
我有一个产品的名称(品牌),口味等,所以我的想法是使用数组和使用,如果字符串包含风味,然后返回“风味:牛肉”等。我花了几个小时来研究如何使用这些功能,但作为初学者不知道如何使它工作。
谢谢你帮忙!
<?php
function flavor($product) {
$arr = array('turkey', 'chicken', 'fish', 'salmon', 'rabbit', 'beef', 'cod');
foreach ($arr as $product) {
return $product;
}
}
?>发布于 2022-02-11 11:18:53
可能是解析它的最好方法,您可以使用正则表达式。
如果你有T-Regx你可以做到
$pattern = pattern('^(.*?) (?:(\d+) ?x ?)?((?:\d+)(?:,\d+)?) ?(k?g)$', 'm');
$match = $pattern->match('Superpremium cat food beef 2 x 3,8 kg');
$match->first(function (Detail $detail) {
$text = $detail->get(1);
$quantity = $detail->group(2)->orReturn(null);
$amount = $detail->get(3);
$unit = $detail->get(4);
var_dump($text, $quantity, $amount, $unit);
});发布于 2022-02-11 11:53:25
这是解决方案的样子:
<?php
$description = <<<EOD
Superpremium cat food light chicken 1 kg
Superpremium cat food light chicken 10kg
Superpremium cat food beef 2x10 kg
Superpremium cat food beef 2 x 3,8 kg
Superpremium cat food beef 2 x 2kg
Superpremium cat food beef 42 x 85g
EOD;
preg_match_all("/.*food\s?([^\d]*)\s?([\d]+)\s*x?\s*([\d,]*)\s*([\w]*)/im", $description, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo 'Flavor: ' . $match[1] . PHP_EOL;
echo 'Number of pieces: ' . $match[2] . PHP_EOL;
echo 'Weight: ' . ($match[3] ?: 1) . PHP_EOL;
echo 'kg/g: ' . $match[4] . PHP_EOL . PHP_EOL;
}解释:
<<<EOD的意思是黑尔多语法中的字符串,它允许在一个变量中处理多行文本。preg_match_all在整个描述文本中查找模式,并将括号中的每一部分保存到$matches变量中。im表示i -不区分大小写,m -多行。PREG_SET_ORDER 常量在$matches变量中设置所需的查找件顺序。PHP_EOL常量表示行尾符号"\n",允许在新行上打印文本。($match[3] ?: 1)是($match[3] ? $match[3] : 1)的缩写,这意味着如果我们在$match[3]数组索引中有一个值,那么我们使用这个值,如果不是,则使用1(如果文本中没有值,则使用1)。https://stackoverflow.com/questions/71079122
复制相似问题