1
skydiver 2016-02-18 13:36:20 +08:00
正则表达式
|
2
Moker 2016-02-18 13:36:48 +08:00
正则匹配出来 然后替换为空
|
3
yhylord 2016-02-18 13:40:17 +08:00 1
使用 DateTime 库和一些字符串操作就可以了。
假设你一条字符串是$str 吧。 $arr = explode(',‘, $str); //将$str 用逗号分隔得到数组 $time_str = $arr[2]; //得到时间那一列 $time_obj = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $time_str); $expected_str = $time_obj -> format('Y-m-d'); //只保留日期 $arr[2] = $expected_str $str = join(',', $arr); 最后$str 就是去掉那一段之后的原字符串剩下的部分了。 变量名起得不好仅供示意。此外我也只会写一点 PHP ,有问题还望斧正。 p.s.: 楼主为什么一定要处理这种数据呢?总觉得这个问题是个 XY 问题。 |
5
yhylord 2016-02-18 13:41:51 +08:00
在我看来如果有库实现了这些格式的处理那最好不要自己写正则了。即使写多点代码也省时省力。
|
6
xuhaoyangx 2016-02-18 13:44:15 +08:00 1
preg_replace("/T[\d]{2}:[\d]{2}:[\d]{2}Z/", "", $msg) 随便写的,错了误笑^^
|
7
flydogs 2016-02-18 13:47:49 +08:00
一些文本编辑器,可以正则替换的。
|
8
risingsun 2016-02-18 13:52:19 +08:00 1
$content = preg_replace('/T.*Z/', '', $content);
|
9
br00k 2016-02-18 13:57:20 +08:00 1
$str = "6688.club,已经注册,2014-05-07T15:02:16Z,2016-05-06";
echo preg_replace('/\w\d\d\:\d\d\:\d\d\w/',"",$str); |
10
moro 2016-02-18 13:58:43 +08:00 1
正则表达式有个递归限制,如果内容太多,需要分批处理,或者按行处理。
|
11
em70 2016-02-18 14:01:26 +08:00 1
如此标准的数据,先'逗号'分隔每一行文本,获得 2014-05-07T15:02:16Z 这类数据,然后用'T'分隔提取 T15:02:16Z,替换原数据的这个字符串为空即可
PS:鄙视楼主伸手党,一点点代码都不愿意写 |
14
CosWind 2016-02-18 14:35:04 +08:00 1
cat filename | sed 's/\([^T]*\)T[^Z]*Z\(.*\)/\1\2/'
|
15
iyaozhen 2016-02-18 14:35:39 +08:00
@em70 再帮楼主一把:
date_default_timezone_set("Asia/Shanghai"); echo date("Y-m-d H:i:s", strtotime("2014-05-07T15:02:16Z")); 结果: 2014-05-07 23:02:16 「 2015-06-17T15:43:28Z 」本身就是一个标准时间表示,但忘记是啥了。 楼主应该需要把上游日志打好。 |
16
yumijie OP 谢谢楼上诸位,我刚刚借鉴楼上一位朋友的代码实现了功能:
<?php $handle = @fopen ("4.txt","r" ); if ( $handle ) { while (( $buffer = fgets ($handle ,4096 )) !== false ) { // echo $buffer."<br>\n"; echo preg_replace('/\w\d\d\:\d\d\:\d\d\w/',"",$buffer)."<br>\n"; } if (! feof ( $handle )) { echo "Error: unexpected fgets() fail\n" ; } fclose ( $handle ); } ?> 其实通篇就是: echo preg_replace('/\w\d\d\:\d\d\:\d\d\w/',"",$buffer)."<br>\n"; 这句代码管用,然后再遍历下文本文件。 |
17
vincenttone 2016-02-18 16:04:24 +08:00 1
读文件即可,正则不用那么复杂
``` <?php $a = '6688.club,已经注册,2014-05-07T15:02:16Z,2016-05-06'; $x = preg_replace('/(T.+?Z)/', '',$a); echo $x; ``` linux 下直接 sed 就可以了 ``` cat 6691.club|sed 's/T.*Z//' ``` |
18
vincenttone 2016-02-18 16:06:01 +08:00 1
@vincenttone 写错了文件名,是 cat 4.txt|sed 's/T.*Z//'
不过看后缀似乎是 windows |
19
xuxu 2016-02-18 16:16:23 +08:00 1
preg_replace('#T[0-9\:]+Z#imu','',$str);
$str 就是你的字符串。 |
20
Xrong 2016-02-18 18:23:36 +08:00
如果量不大的话,直接用 vim 块选择,直接删除就好了
|
21
Xrong 2016-02-18 18:24:25 +08:00
或者 vim 录制一个宏,也非常快
|
22
terrancy 2016-02-18 19:17:13 +08:00 1
strpos() 这个函数可以获取指定的位置再截取就好了;不过上面的比较简单,每一行的长度都一样,T 和 Z 在字符串中的位置都固定的.通过位置截取指定长度也可以实现.数据量少的话正则的肯定更好.
|
23
changlers 2016-02-18 19:48:10 +08:00 1
preg_replace('/T[0-9:]+Z/i','',$object);
|
24
lshero 2016-02-18 20:00:48 +08:00 via Android
直接当 csv 处理不行嘛
|
25
vibbow 2016-02-18 21:18:33 +08:00 1
其实直接 substr 就行了啊...
|
26
hqs123 2016-02-19 08:48:40 +08:00 1
正则表达式可以
|
27
a2231243 2016-02-19 11:01:03 +08:00 1
preg_replace('/T.*Z/', '', $str)
|
28
helieting 2016-03-09 03:59:33 +08:00 via iPhone
Vim 吧
|