PHP 怎样去除中间字符串

2016-02-18 13:25:11 +08:00
 yumijie
6691.club,已经注册,2015-06-17 T17:15:08Z,2016-06-16
就是 去掉 每行“ T17:15:08Z ”这部分 。
6688.club,已经注册,2014-05-07T15:02:16Z,2016-05-06
6689.club,已经注册,2015-06-10T06:03:05Z,2016-06-09
6695.club,已经注册,2015-06-10T14:32:14Z,2016-06-09
6694.club,已经注册,2015-11-08T15:01:24Z,2016-11-07
6693.club,已经注册,2015-06-17T17:20:25Z,2016-06-16
6692.club,已经注册,2015-06-17T17:14:43Z,2016-06-16
6690.club,已经注册,2015-06-22T08:43:14Z,2016-06-21
6605.club,已经注册,2015-06-25T08:43:19Z,2016-06-24
6606.club,已经注册,2015-05-07T15:56:01Z,2016-05-06
6603.club,已经注册,2015-06-25T08:43:17Z,2016-06-24
6604.club,已经注册,2015-11-09T09:13:15Z,2016-11-08
6681.club,已经注册,2015-06-17T13:44:15Z,2016-06-16
6608.club,已经注册,2015-06-10T09:27:52Z,2016-06-09
6607.club,已经注册,2015-06-25T08:43:21Z,2016-06-24
6682.club,已经注册,2015-06-17T15:43:28Z,2016-06-16

这样的,我希望去除 T15:43:28Z 这段,规律是 T 开头,Z 结尾.

我机器上只有 PHP 环境,看得点东 PHP ,其他的程序完全不懂............

求高手指教。。。。。。。
4168 次点击
所在节点    PHP
28 条回复
skydiver
2016-02-18 13:36:20 +08:00
正则表达式
Moker
2016-02-18 13:36:48 +08:00
正则匹配出来 然后替换为空
yhylord
2016-02-18 13:40:17 +08:00
使用 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 问题。
yhylord
2016-02-18 13:40:57 +08:00
@yhylord $expected_str 后面少了个分号。
yhylord
2016-02-18 13:41:51 +08:00
在我看来如果有库实现了这些格式的处理那最好不要自己写正则了。即使写多点代码也省时省力。
xuhaoyangx
2016-02-18 13:44:15 +08:00
preg_replace("/T[\d]{2}:[\d]{2}:[\d]{2}Z/", "", $msg) 随便写的,错了误笑^^
flydogs
2016-02-18 13:47:49 +08:00
一些文本编辑器,可以正则替换的。
risingsun
2016-02-18 13:52:19 +08:00
$content = preg_replace('/T.*Z/', '', $content);
br00k
2016-02-18 13:57:20 +08:00
$str = "6688.club,已经注册,2014-05-07T15:02:16Z,2016-05-06";
echo preg_replace('/\w\d\d\:\d\d\:\d\d\w/',"",$str);
moro
2016-02-18 13:58:43 +08:00
正则表达式有个递归限制,如果内容太多,需要分批处理,或者按行处理。
em70
2016-02-18 14:01:26 +08:00
如此标准的数据,先'逗号'分隔每一行文本,获得 2014-05-07T15:02:16Z 这类数据,然后用'T'分隔提取 T15:02:16Z,替换原数据的这个字符串为空即可

PS:鄙视楼主伸手党,一点点代码都不愿意写
yumijie
2016-02-18 14:30:49 +08:00
@em70 鄙视我吧,我不会啊, PHP 只限于看得懂最简单的代码.
yumijie
2016-02-18 14:31:44 +08:00
@yhylord 呵呵,我扫域名需要处理数据,没有用来干什么坏事,就是想查看什么时间段域名到期
CosWind
2016-02-18 14:35:04 +08:00
cat filename | sed 's/\([^T]*\)T[^Z]*Z\(.*\)/\1\2/'
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 」本身就是一个标准时间表示,但忘记是啥了。

楼主应该需要把上游日志打好。
yumijie
2016-02-18 15:09:02 +08:00
谢谢楼上诸位,我刚刚借鉴楼上一位朋友的代码实现了功能:

<?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";
这句代码管用,然后再遍历下文本文件。
vincenttone
2016-02-18 16:04:24 +08:00
读文件即可,正则不用那么复杂
```
<?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//'
```
vincenttone
2016-02-18 16:06:01 +08:00
@vincenttone 写错了文件名,是 cat 4.txt|sed 's/T.*Z//'
不过看后缀似乎是 windows
xuxu
2016-02-18 16:16:23 +08:00
preg_replace('#T[0-9\:]+Z#imu','',$str);
$str 就是你的字符串。
Xrong
2016-02-18 18:23:36 +08:00
如果量不大的话,直接用 vim 块选择,直接删除就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/257331

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX