Я пытаюсь проанализировать текстовый файл с вкладками, который содержит в одной строке несколько частей данных. Единственный способ различить каждую часть данных состоит в том, что части разделяются пробелами из двух или более пробелов или табуляций.
В стеке я нашел тонны ответов о замене нескольких пробелов одним пробелом, но не смог получить ничего, чтобы ответить на мою проблему, я попытался поиграться с шаблонами регулярных выражений безрезультатно.
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
Вы должны изменить свой 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
Примечание: — Это дает вам массив. И я надеюсь, что вы знаете, как манипулировать им по своему желанию. Благодарю.
Я отредактировал свой ответ и добавил второй, потому что ваш вопрос немного сбивает с толку. Надеюсь, это поможет вам, спасибо.
Если я правильно понимаю ваш вопрос, вы ожидаете, что строка будет обновлена после выполнения preg_split
?
Обратитесь к руководству: preg_split будет разделен на разделитель, поэтому он вернет массив. Тебе нужно preg_replace:
$data = preg_replace("/\s\s+/", " ", $data);
Это даст вам желаемый результат.
Еще одно примечание: предмет вопроса говорит, что вы хотите заменить пространство () символы с тире (-) но в своем вопросе вы говорите о замене несколько пробелов с один пробел?
Я предлагаю другой подход с preg_match_all
,
#^([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
)
)