【问题标题】:PHP using regular expressions to extract content from a stringPHP使用正则表达式从字符串中提取内容
【发布时间】:2011-08-25 14:37:18
【问题描述】:

我有以下字符串,我想从中提取“383-0408”,显然内容发生了变化,但零件编号始终跟随字符串“Our Stk #:”,我怎样才能最优雅地从中提取此信息字符串?

Microchip Technology Inc.
18 PIN, 7 KB FLASH, 256 RAM, 16 I/O 

Mfr's Part #: PIC16F648A-I/SO 
Our Stk #: 383-0408

【问题讨论】:

    标签: php regex str-replace


    【解决方案1】:
    $string = 'YOURSTRING';
    $offset = strpos($string, 'Out Stk #') + 11;
    $final = substr($string, $offset, 8);
    

    如果我们不知道数字的长度,那么可以说 空格 是数字之后的下一个字符,那么:

    $string = 'YOURSTRING';
    $offset = strpos($string, 'Out Stk #') + 11;
    $end = strpos($string, ' ', $offset);
    $final = substr($string, $offset, $end-$offset);
    

    【讨论】:

    • 我已经按照你的方式完成了,但我发现其他答案更适合这个问题。
    • @Richard86 :我们也可以找到它的长度,根据数字后面的下一个字符是什么......可能只是一个空格
    • @Timothy 我只想告诉未来的读者,即使这对我们大多数人来说可能是显而易见的。很多时候substr() 是更好的选择。
    【解决方案2】:

    你可以使用:

    if (preg_match( '/Our Stk #: ([0-9\\-]+)/', $str, $match ))
        echo $match[1];
    

    【讨论】:

      【解决方案3】:
      <?php
      
      $text = "Microchip Technology Inc.
      18 PIN, 7 KB FLASH, 256 RAM, 16 I/O 
      
      Mfr's Part #: PIC16F648A-I/SO 
      Our Stk #: 383-0408";
      
      preg_match('/Our Stk #: (.*)/', $text, $result);
      $stk = $result[1];
      
      ?>
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        <?php
        
        $str = "Microchip Technology Inc.
        18 PIN, 7 KB FLASH, 256 RAM, 16 I/O 
        
        Mfr's Part #: PIC16F648A-I/SO 
        Our Stk #: 383-0408";
        
        if (preg_match('/Our Stk #: (\d*-\d*)/', $str, $matches)) {
            echo $matches[1];
        }
        

        仅当您要查找的数字部分始终具有 digits-digits 形式时,此方法才有效。 @Richard86 给出了一个更通用的解决方案,其中包含任意数量和任意数量的破折号,作为您问题的另一个答案。

        编辑:

        为了避免破折号周围没有数字的情况,正如@Richard86 在评论中所说,正则表达式应如下所示:

        if (preg_match('/Our Stk #: (\d+-\d+)/', $str, $matches)) {
        

        【讨论】:

        • 这个解决方案更适合digits-digits 的形式,这可能是@Timothy 使用的。无论如何,感谢您给予信任。 (如果您想用短划线排除 Stk #(例如,Our Stk #: -),则可以将 (\d*-\d*) 更改为 (\d+-\d+)。)
        • @Richard86 你完全正确。事实上,我会编辑答案以指出这一点。
        猜你喜欢
        • 1970-01-01
        • 2014-10-17
        • 2019-01-10
        • 2014-08-25
        • 1970-01-01
        • 2010-10-14
        • 2018-03-12
        • 1970-01-01
        相关资源
        最近更新 更多