【问题标题】:Php preg_split seperates number with comma in two different numbersphp preg_split 用逗号将数字分隔为两个不同的数字
【发布时间】:2018-12-18 21:14:02
【问题描述】:
$line = "Type:Bid, End Time: 12/20/2018 08:10 AM (PST), Price: $8,000,Bids: 14, Age: 0, Description:  , Views: 120270, Valuation: $10,75, IsTrue: false";

我需要得到这个数组:

Array ( [0] => Bid [1] => 12/20/2018 08:10 AM (PST) [2] => $8,000 [3] => 14 [4] => 0 [5] => [6] => 120270 [7] => $10,75 [8] => false )

【问题讨论】:

  • 你应该告诉之前的回答者你完全改变了数据和预期的输出。现在他们的答案完全无效了。
  • 我看不出有什么理由保留这个问题。在我看来,它的编辑状态很差,应该删除。回答低质量的问题只会助长糟糕的问题。

标签: php arrays explode preg-split


【解决方案1】:

我同意 Andreas 关于使用 preg_match_all() 的观点,但不同意他的模式。

为了稳定性,我建议从头开始使用整个字符串。

  1. 匹配标签及其结尾的冒号。 [^:]+:
  2. 匹配零个或多个空格。 \s*
  3. 忘记到目前为止匹配的内容\K
  4. 延迟匹配零个或多个字符(尽可能返回 - 尽量减少匹配)。 .*?
  5. “向前看”并要求来自 #4 的匹配字符后紧跟逗号,然后是 1 个或多个非逗号和非冒号字符(下一个标签),然后是冒号 ,[^,:]+: 或结尾字符串$

代码:(Demo)

$line = "Type:Bid, End Time: 12/20/2018 08:10 AM (PST), Price: $8,000,Bids: 14, Age: 0, Description:  , Views: 120270, Valuation: $10,75, IsTrue: false";

var_export(
    preg_match_all(
        '/[^:]+:\s*\K.*?(?=\s*(?:$|,[^,:]+:))/',
        $line,
        $out
    )
    ? $out[0]                        // isolate fullstring matches
    : []                             // no matches
);

输出:

array (
  0 => 'Bid',
  1 => '12/20/2018 08:10 AM (PST)',
  2 => '$8,000',
  3 => '14',
  4 => '0',
  5 => '',
  6 => '120270',
  7 => '$10,75',
  8 => 'false',
)

【讨论】:

    【解决方案2】:

    根据新要求的新答案:

    我使用相同的正则表达式来分割字符串,并在冒号之前替换:

    $line = "Type:Bid, End Time: 12/20/2018 08:10 AM (PST), Price: $8,000,Bids: 14, Age: 0, Description:  , Views: 120270, Valuation: $10,75, IsTrue: false";
    
    $parts = preg_split("/(?<!\d),|,(?!\d)/", $line);
    $result = array();
    foreach($parts as $elem) {
        $result[] = preg_replace('/^[^:]+:\h*/', '', $elem);
    }
    print_r ($result);
    

    输出:

    Array
    (
        [0] => Bid
        [1] => 12/20/2018 08:10 AM (PST)
        [2] => $8,000
        [3] => 14
        [4] => 0
        [5] => 
        [6] => 120270
        [7] => $10,75
        [8] => false
    )
    

    【讨论】:

      【解决方案3】:

      我会改用 preg_match。
      在这里,该模式查找数字逗号数字或仅数字或单词和逗号。

      我在字符串后面附加一个逗号以使正则表达式更简单。

      $line = "TRUE,59,m,10,500";
      
      preg_match_all("/(\d+,\d+|\d+|\w+),/", $line . ",", $match);
      var_dump($match);
      

      https://3v4l.org/HQMgu

      即使项目的顺序不同,此代码仍会产生正确的输出:https://3v4l.org/SRJOf

      【讨论】:

      • 请注意,示例数据和所需输出已通过问题编辑进行了更改——导致您的答案不正确。
      【解决方案4】:

      更好的主意:

      $parts=explode(',',$line,4); //explode has a limit you can use in this case 4
      

      相同的结果更少的代码。

      我会保持简单并做到这一点

      $line = "TRUE,59,m,10,500";
      $parts = preg_split("/,/", $line);
      
      //print_r ($parts);
      
      $parts[3]=$parts[3].','.$parts[4]; //create a new part 3 from 3 and 4
      //$parts[3].=','.$parts[4]; //alternative syntax to the above
      unset($parts[4]);//remove old part 4
      print_r ($parts);
      

      我也只会使用explode(),而不是正则表达式。

      【讨论】:

      • @konakzizu 检查编辑以获得更好的方法
      • 嗯,这是一个非常静态的方法。如果是不同的顺序会发生什么?它会失败。
      • @tim 不,你可以发挥一些想象力。
      • 如果您这么认为,他们为什么要发布 substr 答案?显然,静态字符串最好和最简单的方法是 substr.
      • @Andreas 我不知道如何使用 substr(),请赐教。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多