Php preg_split разделяет число запятой на два разных числа - PullRequest
0 голосов
/ 19 декабря 2018
$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 )

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Новый ответ в соответствии с новым запросом:

Я использую тот же регулярное выражение для разбиения строки, и я заменяю после того, что находится перед двоеточием:

$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
)
0 голосов
/ 19 декабря 2018

Вместо этого я использовал бы 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

0 голосов
/ 19 декабря 2018

Если цифру, за которой следует запятая и цифра, не следует разделять, вы можете сопоставить цифры 1+, повторить структуру группировки, которая соответствует запятой, за которой следуют цифры 1+, и использовать SKIP FAIL для пропускаэтот матчЗатем используйте чередование, чтобы сопоставить только запятую:

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

См. Демоверсию regex | 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>
0 голосов
/ 19 декабря 2018

намного лучшая идея:

$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() вместо регулярного выражения.

...