Разбить данные на элементы массива на основе двух или более пробелов

Я пытаюсь проанализировать текстовый файл с вкладками, который содержит в одной строке несколько частей данных. Единственный способ различить каждую часть данных состоит в том, что части разделяются пробелами из двух или более пробелов или табуляций.

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

 DER V3,0,0,3323  Xkisjd                 2014 02 25 05:23    PGM / RUN BY / DATE

Я использовал что-то вроде этого, но это не влияет на данные. Я подозреваю, что это связано с тем, что данные начинаются с вкладки.

 preg_split("/\s\s+/", $data, -1, PREG_SPLIT_NO_EMPTY);

Буду признателен за любую помощь или предложения.

Ожидаемый результат будет массив:

 PGM => DER V3,0,0,3323
RUN BY => Xkisjd
DATE => 2014 02 25 05:23

2

Решение

Вы должны изменить свой preg_split немного. Проверь это:-

<?php
$string ='DER V3,0,0,3323  Xkisjd                 2014 02 25 05:23    PGM / RUN BY / DATE';

echo "<pre/>";print_r(preg_split("/\s\s+/",$string));

?>

Выход:- http://prntscr.com/796wd7

Если вы хотите, пространство заменится на - затем сделайте так:

$data = preg_replace("/\s\s+/", "-", $string);
echo $data;

Выход:- http://prntscr.com/7972nf

Примечание: — Это дает вам массив. И я надеюсь, что вы знаете, как манипулировать им по своему желанию. Благодарю.

Я отредактировал свой ответ и добавил второй, потому что ваш вопрос немного сбивает с толку. Надеюсь, это поможет вам, спасибо.

2

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

Если я правильно понимаю ваш вопрос, вы ожидаете, что строка будет обновлена ​​после выполнения preg_split?

Обратитесь к руководству: preg_split будет разделен на разделитель, поэтому он вернет массив. Тебе нужно preg_replace:

$data = preg_replace("/\s\s+/", " ", $data);

Это даст вам желаемый результат.

Еще одно примечание: предмет вопроса говорит, что вы хотите заменить пространство () символы с тире (-) но в своем вопросе вы говорите о замене несколько пробелов с один пробел?

1

Я предлагаю другой подход с preg_match_all,

Regex:

#^([a-z]+\s+[a-z]\d+(?:,\d+)+)\s*(\S+)\s*([\d:\s]+\d)\s*([^\/]+)\s+\/\s+([^\/]+)\s+\/\s+([^\/]+)\s+$#im

Вот образец кода:

$re = "/^([a-z]+\\s+[a-z]\\d+(?:,\\d+)+)\\s*(\\S+)\\s*([\\d:\\s]+\\d)\\s*([^\\/]+)\\s+\\/\\s+([^\\/]+)\\s+\\/\\s+([^\\/]+)\\s+$/mi";
$str = "DER V3,0,0,3323  Xkisjd                 2014 02 25 05:23    PGM / RUN BY / DATE \nVER V1,2,4,0003  MfgHJd                 2015 12 11 11:13    PGM / RUN BY / DATE ";
preg_match_all($re, $str, $matches);
$cnt = count($matches[0]);
$arr = array();
for ($i = 0; $i < $cnt; $i++) {
$arrAdd = array();
$arrAdd[$matches[4][$i].trim()] = $matches[1][$i];
$arrAdd[$matches[5][$i]] = $matches[2][$i];
$arrAdd[$matches[6][$i]] = $matches[3][$i];
array_push($arr, $arrAdd);
}
print_r($arr);

Результат:

Array
(
[0] => Array
(
[PGM] => DER V3,0,0,3323
[RUN BY] => Xkisjd
[DATE] => 2014 02 25 05:23
)

[1] => Array
(
[PGM] => VER V1,2,4,0003
[RUN BY] => MfgHJd
[DATE] => 2015 12 11 11:13
)

)
1
По вопросам рекламы [email protected]