【问题标题】:PHP - Regex optimization split string in partsPHP - 正则表达式优化拆分字符串部分
【发布时间】:2020-11-10 13:00:05
【问题描述】:

在 PHP 中,我尝试使用正则表达式将字符串拆分为不同部分的数组元素。

例如这是我的字符串:

$string1 = "For a serving of 100 g Sugars: 2.3 g (Approximately)";
$string2 = "For a serving of 100 g Saturated Fat: 5.8 g (Approximately)";
$string3 = "For a portion of 100 g Energy Value: 290 kcal (Approximately)";

我想从这些字符串中提取特定信息:

$arrayString1 = array('100 g','Sugars', '2.3 g');
$arrayString2 = array('100 g','Saturated Fat', '5.8 g');
$arrayString3 = array('100 g','Energy Value', '290 kcal');

我做了这个正则表达式:

(^For a serving of )([\d g]*)([^:]*)(: )([\d.\d]*)( )([a-z]*)

你知道如何优化这个正则表达式吗?

谢谢

【问题讨论】:

    标签: php regex string


    【解决方案1】:

    你可以让它更具体地匹配 g 或 kcal 和数字。

    要匹配所有示例,您可以使用替代来匹配任一替代(?:serving|portion)

    您可以使用 3 个捕获组,而不是使用 7 个捕获组。

    您可以省略第一个捕获组(^For a serving of ),并结合数字和单位的值。

    ^For\h+a\h+(?:serving|portion)\h+of\h+(\d+\h+g)\h+([^:\r\n]+):\h+(\d+(?:\.\d+)? (?:g|kcal))\b
    
    • ^ 字符串开始
    • For\h+a\h+(?:serving|portion)\h+of\h+ 将字符串的开头与servingportion 匹配
    • (\d+\h+g)\h+ 捕获组 1,匹配 1+ 位和 g
    • ([^:\r\n]+):\h+ 捕获组 2,匹配除 : 之外的任何字符 1+ 次,然后匹配 : 和 1+ 水平空白字符
    • ( 捕获第 3 组
      • \d+(?:\.\d+)? 匹配 1+ 位数字和可选的小数部分
      • \h+(?:g|kcal) 匹配 1+ 个水平空白字符和 gkcal
    • )\b 关闭第 3 组和单词边界以防止单词成为较长单词的一部分

    Regex demo | Php demo

    例如

    $pattern = "~^For\h+a\h+(?:serving|portion)\h+of\h+(\d+\h+g)\h+([^:\r\n]+):\h+(\d+(?:\.\d+)?\h+(?:g|kcal))\b~";
    $strings = [
        "For a serving of 100 g Sugars: 2.3 g (Approximately)",
        "For a serving of 100 g Saturated Fat: 5.8 g (Approximately)",
        "For a portion of 100 g Energy Value: 290 kcal (Approximately)"
    ];
    
    foreach ($strings as $string) {
        preg_match($pattern, $string, $matches);
        array_shift($matches);
        print_r($matches);
    }
    

    输出

    Array
    (
        [0] => 100 g
        [1] => Sugars
        [2] => 2.3 g
    )
    Array
    (
        [0] => 100 g
        [1] => Saturated Fat
        [2] => 5.8 g
    )
    Array
    (
        [0] => 100 g
        [1] => Energy Value
        [2] => 290 kcal
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2013-11-19
      • 2011-06-18
      相关资源
      最近更新 更多