我试图解析一个标签文本文件,它在单行上有多个部分的数据,区分每个部分数据的唯一方法是,这些部分由两个或多个空格或制表符的间隙分开。
我在堆栈上找到了大量关于将多个空间替换为单个空间的答案,但没有能够得到任何答案来回答我的问题,我尝试过使用正则表达式模式来玩,但无济于事。
DER V3,0,0,3323 Xkisjd 2014 02 25 05:23 PGM / RUN BY / DATE
我正在使用这样的东西,但它不影响数据,我怀疑这是由于数据开始由制表符分隔。
preg_split("/ss+/", $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("/ss+/",$string));
?>
输出:http://prntscr.com/796wd7
如果你想用-
替换空格,那么这样做:-
$data = preg_replace("/ss+/", "-", $string);
echo $data;
输出:http://prntscr.com/7972nf
注意:-它给你一个数组。我希望你知道如何根据你的意愿操纵它。谢谢。
我编辑了我的答案并添加了第二个,因为你的问题有点令人困惑。
如果我正确理解你的问题,你期望在执行preg_split
后更新字符串吗?
参考手册:preg_split将按分隔符分割,因此它将返回一个数组。您需要preg_replace:
$data = preg_replace("/ss+/", " ", $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
)
)