【问题标题】:regular expression convert version wrong正则表达式转换版本错误
【发布时间】:2020-04-10 11:59:51
【问题描述】:

嘿社区我有一个问题,我正在使用正则表达式,而不是获得完整版本,我得到以下 _3 我应该得到 13_3

这就是我使用表达式的方式 -

$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/os ([0-9]?.[0-9]?[0-9]?[0-9]?[0-9])*/';
preg_match($pattern,strtolower($useragent),$m);

这就是我在 Android 上使用它的方式 -

$useragent = "Mozilla/5.0 (Linux; Android 8.1.0; moto e5 play Build/OPGS28.54-53-8-11; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.162 Mobile Safari/537.36";
$pattern = '/android ((\d+|\.).[^ ,);]+)/';
preg_match($pattern,strtolower($useragent),$m);

我做错了什么?

【问题讨论】:

  • 可能是preg_match('/os ([0-9]+(?:_[0-9]+)?)/i', $useragent, $m)?
  • 是的,但这不适用于例如 13_3_3
  • 垫子,我在回答中解决了这个问题。

标签: php regex preg-match


【解决方案1】:

在您的模式中,您没有考虑可能的下划线。

这部分 [0-9]?.[0-9]?[0-9]?[0-9]?[0-9] 匹配一个可选数字,除了换行符之外的任何字符,后跟 3 个可选数字和一个也可能匹配的数字,例如 x1

您获得了值_13,因为您正在重复捕获本身,捕获最后一次迭代的值。

您也可以使用\K 来清除匹配缓冲区并仅获取匹配项。

\bos\h+\K\d+(?:_\d+)*\b
  • \b字边界
  • os 字面匹配
  • \h+\K 匹配 1+ 个水平空白字符,然后忘记匹配的内容
  • \d+(?:_\d+)* 匹配 1+ 位可选地重复 _ 和 1+ 位
  • \b字边界

Regex demo

例如

$useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
$pattern = '/\bos\h+\K\d+(?:_\d+)*\b/';
preg_match($pattern,strtolower($useragent),$m);
print_r($m[0]);

输出

13_3

【讨论】:

    【解决方案2】:

    你可以使用

    preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)
    

    请参阅regex demo

    • os - 一个字符串
    • \s+ - 1+ 个空格
    • ([0-9]+(?:_[0-9]+)*) - 捕获组 1:
      • [0-9]+ - 1 位以上
      • (?:_[0-9]+)* - 0 次或多次出现 _ 和 1 位以上的数字。

    PHP demo:

    $useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
    if (preg_match('/os\s+([0-9]+(?:_[0-9]+)*)/i', $useragent, $m)) {
       print_r($m);
    }
    

    【讨论】:

      【解决方案3】:

      preg_match('/os ([0-9].(?:_?[0-9]+)+)*/gi',$useragent,$m);

      这将是代码:

      $useragent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_33 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148";
      if (preg_match('/os ([0-9].(?:_?[0-9]+)+)*/', $useragent, $m)) {
          var_dump($m);
      }
      

      第 1 组的输出: 13_3_33

      【讨论】:

        猜你喜欢
        • 2011-10-02
        • 2016-04-02
        • 1970-01-01
        • 2019-05-11
        • 2014-11-08
        • 2017-12-29
        • 2023-03-09
        • 2013-06-26
        相关资源
        最近更新 更多