【问题标题】:Regex for hex with spaces带空格的十六进制正则表达式
【发布时间】:2012-07-12 12:27:16
【问题描述】:

我试图弄清楚为什么这个正则表达式与这条线不匹配,但我没有更多的想法。

(?:([a-zA-Z0-9]{2})\s\s)+
53  65  72  76  65  72  3a  20  41  70  61  63  68  65  00  45  

但这并不能捕获所有的十六进制字节...

UPD:我需要抓住每一口 preg_match $results

【问题讨论】:

    标签: php regex hex


    【解决方案1】:

    你怎么知道那是两个空格而不是一个制表符?试试这个正则表达式:

    /^(?:([a-f0-9]{2})\s*)+$/i
    

    请注意,我已将其范围缩小为仅匹配十六进制,而不是 base-36。此外,您的正则表达式可能不匹配,因为它正在字符串末尾寻找空格。

    【讨论】:

      【解决方案2】:

      该正则表达式确实匹配该行,假设您粘贴到问题中的行正是您要匹配的行:

      <?php
      $hex = "53  65  72  76  65  72  3a  20  41  70  61  63  68  65  00  45  ";
      
      preg_match('/(?:([a-zA-Z0-9]{2})\s\s)+/', $hex, $matches);
      var_dump($matches);
      

      输出:

      array(2) {
        [0]=>
        string(64) "53  65  72  76  65  72  3a  20  41  70  61  63  68  65  00  45  "
        [1]=>
        string(2) "45"
      }
      

      不过,您最有可能尝试做的是获取单个十六进制字节的数组,因此,如果您在该正则表达式中使用与上述类似的代码,那么您做错了。它应该是这样的:

      preg_match_all('/([a-zA-Z0-9]{2})\s{2}/', $hex, $matches);
      // $matches[1] will be your array of hex bytes
      

      【讨论】:

      • @Fedcomp 如果你只想获取它们的数组,你可以使用explode(' ', $hex)(两个空格作为分隔符)
      • @Umbrella:该方法实际上与所需的模式不匹配,并且对于像"! ? ^ $" 这样的输入会错误地工作。即使有测试输入,它也会在末尾留下一个 NULL 数组元素(由于尾随空格)。
      【解决方案3】:

      只有几个原因,为什么这不符合您的输入。请检查该行是否以两个空格结尾,以及每个数字之间是否真的有两个空格字符。还要检查您的输入是否包含字符代码 160(牢不可破的空格),因为据我所知 PCRE 不会将其识别为 \s。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 2014-03-05
        • 2011-10-03
        • 1970-01-01
        • 2010-10-20
        • 2021-06-04
        相关资源
        最近更新 更多