【问题标题】:Extracting number within two square brackets提取两个方括号内的数字
【发布时间】:2021-02-04 12:52:49
【问题描述】:

我已经看到与我相关的 question,但我还有一个额外的条件要添加,我不知道如何处理。

\[(.*?)\]

现在这段代码将提取方括号内的所有内容,但我希望只提取数字。

假设我有以下表达式[+₪7.00],我希望只提取7.007

如何使用正则表达式仅从方括号中提取数字?

编辑:

这是我迄今为止尝试过的:

\[([^\d])\]

[^\d] 假设只从字符串中提取数字,但这在这里不起作用。

由于7.00中的点,它也会给我700而不是7

编辑:

//Add Addons & Prices
if($slug == "addon"){
    $temp = explode(',', $value);
    $group = [];
    foreach($temp as $t){
        echo $t;
        $regex = "/\[[^][\d]*\K\d+(?:\.\d+)?(?=[^][]*])/";
        $price = 0;
        $str = $t;
        if (preg_match_all($regex, $str, $matches)) {
            foreach ($matches[0] as $match => $m) {
                $price = $m;
             }
        }
        echo $price;
        echo '<br/>';
        $g = [
            'name' => $t,
            'values' => [
                [
                    'id' => 0,
                    'name' => $t,
                    'price' => $price
                ]
            ]
        ];
        array_push($group, $g);
    }
}

【问题讨论】:

  • 能否请您显示您当前的正则表达式以查看问题所在?此外,还不清楚您想对 [+7.00 and 89] 案例做什么。
  • @WiktorStribiżew 不应该期待这样的情况,只有一个数字。

标签: php regex


【解决方案1】:

要从方括号之间提取单个数字,您可以使用

\[[^][\d]*\K\d+(?:\.\d+)?(?=[^][]*])

请参阅regex demo详情

  • \[ - 一个 [ 字符
  • [^][\d]* - 除了[] 和数字之外的零个或多个字符
  • \K - 匹配重置操作符,从当前整体匹配内存缓冲区中丢弃所有匹配的文本
  • \d+(?:\.\d+)? - 一位或多位数字后跟. 和一位或多位数字的可选序列
  • (?=[^][]*]) - 正向前瞻,需要除 [] 之外的零个或多个字符,然后在当前位置右侧紧邻一个 ] 字符。

PHP demo

$re = '/\[[^][\d]*\K\d+(?:\.\d+)?(?=[^][]*])/';
$str = 'I have the following expression [+₪7.00], I wish to extract only 7.00 or 7.';
if (preg_match_all($re, $str, $matches)) {
   print_r($matches[0]);
}
// => Array( [0] => 7.00 )

以防万一您要提取多个数字...

然后,你可以使用

(?:\G(?!\A)|\[)[^][\d]*\K\d+(?:\.\d+)?(?=[^][]*])

this regex demo(?:\G(?!\A)|\[) 匹配上一个成功匹配的结尾或 [ 字符。

【讨论】:

  • 我有另一个问题,我的字符串中有希伯来语,而正则表达式不适用于希伯来语,这可能是什么原因?这是我的字符串:בולגרית [+₪7.00] - 调试结果:8362 而不是 7.00
  • @ExCluSiv3 你能检查一下this demo吗?我没有发现任何问题。
  • 这很奇怪,当我使用 foreach 循环 (בולגרית [+₪7.00]) 从数组中提取值时,我得到了 8362,但是当使用相同的字符串时(而不是将其从数组中取出),我得到了正确的值 (7.00)。我不明白为什么会这样,有什么想法吗?
  • @ExCluSiv3 $re = '/\[[^][\d]*\K\d+(?:\.\d+)?(?=[^][]*])/u';
  • @ExCluSiv3 您可能需要改用html_entity_decode($str) 来将实体转换为文字字符。
猜你喜欢
  • 1970-01-01
  • 2016-08-19
  • 2014-09-05
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2021-05-13
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多