php preg_split用两个不同的逗号分隔数字

时间:2018-12-18 21:14:02

标签: php arrays explode preg-split

$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 )

5 个答案:

答案 0 :(得分:2)

我同意安德烈亚斯(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',
)

答案 1 :(得分:0)

很多更好的主意:

$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()而不是正则表达式。

答案 2 :(得分:0)

我会改用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

答案 3 :(得分:0)

如果不应该将数字后跟逗号和数字分开,则可以匹配1个以上的数字,重复匹配一个逗号后跟1个以上的数字的分组结构,然后使用SKIP FAIL跳过该匹配。然后使用交替方式仅匹配逗号:

\d+(?:,\d+)+(*SKIP)(*F)|,

请参见regex demo | Php demo

例如:

$line = "TRUE,59,m,10,500";
$parts = preg_split("/\d+(?:,\d+)+(*SKIP)(*F)|,/", $line);

echo '<table>';
foreach($parts as $parts){
    echo '<th>';
    echo ($parts);
    echo '</th>';
}
echo '<table>';

结果

<table><th>TRUE</th><th>59</th><th>m</th><th>10,500</th><table>

答案 4 :(得分:0)

根据新要求的新答案:

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

$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
)