【问题标题】:Regex to split string by space and number using preg_split in PHP?正则表达式在 PHP 中使用 preg_split 按空格和数字分割字符串?
【发布时间】:2022-08-07 09:44:13
【问题描述】:

我需要按数字和空格拆分字符串,但不确定正则表达式。我的代码是:

$array = preg_split(\'/[0-9].\\s/\', $content);

$content 的值是:

Weight 229.6104534866 g
Energy 374.79170898476 kcal
Total lipid (fat) 22.163422468932 g
Carbohydrate, by difference 13.641848209743 g
Sugars, total 4.3691034101428 g
Protein 29.256342349938 g
Sodium, Na 468.99386390008 mg 

这给出了结果:

Array ( [0] => Weight 229.61045348 [1] => g
Energy 374.791708984 [2] => kcal
Total lipid (fat) 22.1634224689 [3] => g
Carbohydrate, by difference 13.6418482097 [4] => g
Sugars, total 4.36910341014 [5] => g
Protein 29.2563423499 [6] => g
Sodium, Na 468.993863900 [7] => mg
) 1

我需要将文本与数字分开,但不确定如何,这样:

[0] => Weight
[1] => 229.60145348
[2] => g

等等...

我还需要它来忽略标签所在的逗号、括号和空格。使用explode时,我发现“总脂质(脂肪)”不是将一个值分成3个值,不知道如何用正则表达式解决这个问题。

当使用 explode() 我得到:

[0] => Total
[1] => lipid
[2] => (fat)

但我需要这些值作为标签的一个值,有什么方法可以忽略它吗?

非常感谢任何帮助!

  • 为什么不使用explode() 函数?
  • 请您edit 包含minimal reproducible example - 向我们展示您打印的输出来自的输入,以及您想要该输入的确切输出。

标签: php arrays regex preg-split


【解决方案1】:

而不是分裂,你可能会很好匹配和捕获所需的部分,例如使用以下模式:

^(?P<category>\D+)\s+(?P<value>[\d.]+)\s+(?P<unit>.+)

a demo on regex101.com


PHP 这可能是

<?php

$data = 'Weight 229.6104534866 g
Energy 374.79170898476 kcal
Total lipid (fat) 22.163422468932 g
Carbohydrate, by difference 13.641848209743 g
Sugars, total 4.3691034101428 g
Protein 29.256342349938 g
Sodium, Na 468.99386390008 mg ';

$pattern = '~^(?P<category>\D+)\s+(?P<value>[\d.]+)\s+(?P<unit>.+)~m';

preg_match_all($pattern, $data, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
print_r($matches);
?>

a demo on ideone.com

【讨论】:

    【解决方案2】:

    作为使用 preg_ 函数的替代方法,sscanf() 允许将十进制值显式键入为浮点数(如果这很有价值)。

    不幸的是,由于sscanf() 的贪婪特性,标签和浮点值之间的空间仍将附加到标签字符串。如果这是一个问题,标签值将需要为rtrim()ed。

    代码:(Demo)

    // $contentLines = file('path/to/content.txt');
    $contentLines = [
        'Weight 229.6104534866 g',
        'Energy 374.79170898476 kcal',
        'Total lipid (fat) 22.163422468932 g',
        'Carbohydrate, by difference 13.641848209743 g',
        'Sugars, total 4.3691034101428 g',
        'Protein 29.256342349938 g',
        'Sodium, Na 468.99386390008 mg',
    ];
    
    var_export(
        array_map(
            fn($line) => sscanf(
                $line,
                '%[^0-9]%f%s',
            ),
            $contentLines
        )
    );
    

    【讨论】:

      【解决方案3】:

      你可以用任何字符分割爆炸PHP 中的函数。

      <?php
      $string = "Weight 100 g";
      $explodedArray = explode(" ", $string); // first parameter is separator
      ?>
      

      这将设置

      [0] => Weight
      [1] => 100
      [2] => g
      

      【讨论】:

      • 您好,感谢您的答复。问题是我需要的一些标签包括空格、括号和逗号,我需要忽略它们。 Explode 将采用一个条目并将其设为 3,如示例中所示。
      • 我明白了,你可以用 str_replace 函数替换它们,但可能会有不同的情况。你能提供更多的例子吗?
      【解决方案4】:

      感谢大家的帮助。我发现通过在所有值之间添加一个双倍空格然后将explode参数设置为双倍空格它忽略了我需要的东西。

      【讨论】:

      • 看看答案,实际上这肯定不是最好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多