首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PHP中的字符串中提取数据

从PHP中的字符串中提取数据
EN

Stack Overflow用户
提问于 2022-02-11 11:09:20
回答 2查看 69关注 0票数 -1

我是一个PHP的完全初学者。我有几百种产品描述,例如:

  • 超高档猫粮轻鸡1公斤
  • 超高档猫粮轻鸡肉10公斤
  • 优质猫粮牛肉2x10公斤
  • 超级优质猫粮牛肉2x3,8公斤
  • 优质猫粮牛肉2x2公斤
  • 超高档猫粮牛肉42x85g

我需要从产品名称中提取出风味、数量和重量的名称如下:

例如,

来自:超级优质猫粮牛肉42 x 85克

对此:

  • 风味:牛肉
  • 作品数: 42
  • 重量: 85
  • 公斤/克:克

我试着使用数组,但它对我根本不起作用。

数字太乱了。有时10公斤,有时10公斤,有一个缺口,你可以在上面的例子中看到。

我有一个产品的名称(品牌),口味等,所以我的想法是使用数组和使用,如果字符串包含风味,然后返回“风味:牛肉”等。我花了几个小时来研究如何使用这些功能,但作为初学者不知道如何使它工作。

谢谢你帮忙!

代码语言:javascript
复制
<?php
function flavor($product) {

$arr = array('turkey', 'chicken', 'fish', 'salmon', 'rabbit', 'beef', 'cod');
foreach ($arr as $product) {
    return $product;
    
}   
}

?>
EN

回答 2

Stack Overflow用户

发布于 2022-02-11 11:18:53

可能是解析它的最好方法,您可以使用正则表达式。

如果你有T-Regx你可以做到

代码语言:javascript
复制
$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);
});
票数 0
EN

Stack Overflow用户

发布于 2022-02-11 11:53:25

这是解决方案的样子:

代码语言:javascript
复制
<?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变量中。
  • regex模式末尾的im表示i -不区分大小写,m -多行。
  • PREG_SET_ORDER 常量$matches变量中设置所需的查找件顺序。
  • PHP_EOL常量表示行尾符号"\n",允许在新行上打印文本。
  • ($match[3] ?: 1)($match[3] ? $match[3] : 1)的缩写,这意味着如果我们在$match[3]数组索引中有一个值,那么我们使用这个值,如果不是,则使用1(如果文本中没有值,则使用1)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71079122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档