PHP Regex Несколько экземпляров

В настоящее время я импортирую данные в формате CSV, и мне нужно, чтобы все было хорошо и выстроено.

Меньший пример данных выглядит следующим образом.

"Name","Address""John Doe","5111 Fury Rd
Santa Cruz""Jane Doe","321 Tess St Texas""Josh Doe","653 1st St
Orlando Florida
United States"

Как вы можете видеть, нам нужно разбивать на разрывы строк вне кавычек, так как str_getcsv не многострочный.

Я изначально использовал это выражение.

$lines = preg_split('/[\r\n]{1,2}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/',$data);

Однако preg_split потерял кровать, когда количество символов в строке превысило XXXX.

Так что прибегая к preg_match_all в настоящее время, но нужны проблемы с селектором регулярных выражений.

preg_match_all('/^(.*?)[\r\n]{1,2}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $data, $matches);

В настоящее время это соответствует только первый экземпляр.

Array(
[0] => Array ( [0] => "Name","Address")
[1] => Array ( [0] => "Name","Address")
)

Любой ключ, чтобы заставить его вернуть все данные в массиве?

-3

Решение

Вот один из способов разобрать это. Я закомментировал часть, которая удаляет новые строки в адресе. Если вы хотите, просто удалите комментарии.

$re = '/\"(.*?)\",\"(.*?)\"/s';
$data = '"Name","Address""John Doe","5111 Fury Rd
Santa Cruz""Jane Doe","321 Tess St Texas""Josh Doe","653 1st St
Orlando Florida
United States"';

preg_match_all($re, $data, $matches);

/*
foreach($matches[2] as &$value){
$value = str_replace(PHP_EOL, " ", $value);
}
*/
var_dump($matches);

https://3v4l.org/7kRDt

Вывод с foreach:

array(3) {
[0]=>
array(4) {
[0]=>
string(16) ""Name","Address""[1]=>
string(36) ""John Doe","5111 Fury Rd
Santa Cruz""[2]=>
string(30) ""Jane Doe","321 Tess St Texas""[3]=>
string(53) ""Josh Doe","653 1st St
Orlando Florida
United States""}
[1]=>
array(4) {
[0]=>
string(4) "Name"[1]=>
string(8) "John Doe"[2]=>
string(8) "Jane Doe"[3]=>
string(8) "Josh Doe"}
[2]=>
array(4) {
[0]=>
string(7) "Address"[1]=>
string(23) "5111 Fury Rd Santa Cruz"[2]=>
string(17) "321 Tess St Texas"[3]=>
&string(40) "653 1st St Orlando Florida United States"}
}
0

Другие решения

Если вам нужно использовать preg_match_all() Вы можете попробовать этот шаблон, чтобы создать массив совпадений, а затем сопоставить str_getcsv() по результатам; например:

<?php

$csvString = <<<CSV
"Name","Address""John Doe","5111 Fury Rd
Santa Cruz""Jane Doe","321 Tess St Texas""Josh Doe","653 1st St
Orlando Florida
United States
CSV;preg_match_all('/(.*)(?:\n)/m', $csvString, $csvRows);

$csvData = array_map(function ($csvRow) {
return str_getcsv($csvRow);
}, $csvRows[1]);

print_r($csvData);

Учитывая ваш пример ввода, это дает:

Array
(
[0] => Array
(
[0] => Name
[1] => Address
)

[1] => Array
(
[0] => John Doe
[1] => 5111 Fury Rd
)

[2] => Array
(
[0] => Santa Cruz")

[3] => Array
(
[0] => Jane Doe
[1] => 321 Tess St Texas
)

[4] => Array
(
[0] => Josh Doe
[1] => 653 1st St
)

[5] => Array
(
[0] => Orlando Florida
)

)

Надеюсь это поможет 🙂

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector