【问题标题】:Explode a string that has quotes in it分解包含引号的字符串
【发布时间】:2012-10-03 14:41:21
【问题描述】:

我正在寻找位于字符串中的数据,如下所示: string(22) "width="16" height="16""

我希望使用explode 函数来获取16 和16 的值并将它们放入我可以使用的数组中。但我不知道如何在 PHP 的explode 函数中定位$num。通常我只有一个可以使用的逗号。

类似这样,但我知道这是错误的:

$size = "width="16" height="16""
$sizes = explode('""', $size);

所有这些都是:array(1) { [0]=> string(5) "Array" }

【问题讨论】:

    标签: php arrays quotes explode


    【解决方案1】:

    explode() 不会为您执行此操作;它只是在常量分隔符(例如逗号)上拆分字符串,您需要做的是从引号之间提取文本。在这个简单的例子中,您可以使用 preg_match_all() 来完成这项工作:

     $str = 'width="16" height="16"';
     preg_match_all('/\"(.*?)\"/', $str, $matches);
     print_r($matches);
    

    返回

     Array
     (
       [0] => Array
         (
           [0] => "16"
           [1] => "16"
         )
    
       [1] => Array
         (
           [0] => 16
           [1] => 16
         )
     )
    

    --换句话说,在 preg_match_all() 调用之后,$matches[1] 包含一个与模式匹配的值数组,在本例中是您所追求的属性值。

    【讨论】:

    • +1,因为不使用旧式的爆炸方式。不过,不知道为什么那里有问号,因为已经有一个星号。也许它应该在括号之外?
    • 感谢您的回答,这看起来是一种使用更少代码的简洁方式。
    • @johnrom:问号把*量词变小气了;默认情况下,它将匹配尽可能多的字符,在这种情况下,这将导致它匹配 '16" height="16' -- 字符串中第一个引号和最后一个引号之间的所有内容。如果您以前没有遇到过这种情况,您可能希望提高对 Perl 兼容的正则表达式的熟悉程度。
    • @AaronMiller 我对 Perl 正则表达式比较熟悉,但不需要保留 ?记住,因为我通常使用上面的 [^"] 或 [^>] 语法,并且一直被建议不要尝试控制正则表达式的贪婪。perlmonks.org/?node_id=24640
    • @johnrom,我发现这是一个有些人为的例子;在使用“(。*?)\?”的所谓不精确的正则表达式中,引用的问号后面的不带引号的问号将产生所需的结果,即,将捕获引号之间的文本,没有尾随问号。我还要指出,自从给出该建议以来,PCRE 引擎在十二年中得到了改进,处理器也是如此,并且在尚未证明性能问题时,优化可读性通常比优化性能更可取。
    【解决方案2】:

    奇怪的变量。

    无论哪种方式,为什么不使用拆分命令?

    $size = 'width="16" height="16"';
    
    $split_sizes = explode('"',$size);
    $count = count($split_sizes);
    
    for ( $i = 1; $i < $count; $i += 2) {
        $sizes[] = $split_sizes[$i];
    }
    

    这里的假设是字符串将只填充成对的不带引号的键和双引号的值。

    【讨论】:

    • 完美,正是我想要的!
    【解决方案3】:

    试试这个

    preg_match_all('/"([^"]+)"/', 'width="16" height="16"', $matches);
    $result = $matches[1];
    
    /* print_r($result);
    Array
    (
            [0] => 16
            [1] => 16
    )
    */
    

    【讨论】:

      【解决方案4】:

      我会这样做:

      $size = 'width="16" height="16" maxlength="200"';
      preg_match_all('/([A-Za-z\-]+)=/',$size,$fields);
      preg_match_all('/[A-Za-z\-]+="([A-Za-z0-9_\-]+)"/',$size,$values);
      var_dump($fields[1]);
      var_dump($values[1]);
      
      // gives you
      array(3) {
        [0]=>
        string(5) "width"
        [1]=>
        string(6) "height"
        [2]=>
        string(9) "maxlength"
      }
      array(3) {
        [0]=>
        string(2) "16"
        [1]=>
        string(2) "16"
        [2]=>
        string(3) "200"
      }
      

      【讨论】:

        【解决方案5】:

        如果值将成为字符串中的唯一数字 (1234567890),您可以使用正则表达式来选择这些值。 preg_filter() 会做这样的事情 - 只需让你的“替换”用自己替换匹配项 ('$1')。

        【讨论】:

          【解决方案6】:

          如何摆脱双引号并在空间上爆炸。然后 $sizes 看起来像:

          { 
              [0]=> width=16
              [1]=> height=16
          }
          

          然后,您可以在 equals 上分解 $sizes 的每个切片以获取值。

          {
              [0] => width
              [1] => 16
          }
          {
              [0] => height
              [1] => 16
          }
          

          示例代码:

          <?php
          
          $size = 'width="16" height="16";
          //get rid of all double quotes
          $size = str_replace('"', '', $size);
          $sizes = explode(' ', $size);
          //show what is in the sizes array
          print_r($sizes);
          //loop through each slide of the sizes array
          foreach($sizes as $val)
          {
              $vals = explode('=', $val);
          //show what is in the vals array during this iteration
              print_r($vals);
          }
          
          ?>
          

          【讨论】:

            【解决方案7】:

            你可以简单地使用

            explode("\"",$string);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-03-17
              • 2013-05-31
              • 2016-04-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多