基于两个或多个空格将数据分解为数组元素


Break data into array elements based of two or more spaces

我试图解析一个标签文本文件,它在单行上有多个部分的数据,区分每个部分数据的唯一方法是,这些部分由两个或多个空格或制表符的间隙分开。

我在堆栈上找到了大量关于将多个空间替换为单个空间的答案,但没有能够得到任何答案来回答我的问题,我尝试过使用正则表达式模式来玩,但无济于事。

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