V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yumijie
V2EX  ›  PHP

PHP 怎样去除中间字符串

  •  
  •   yumijie · 2016-02-18 13:25:11 +08:00 · 4446 次点击
    这是一个创建于 3234 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 ,其他的程序完全不懂............

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

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

    楼主应该需要把上游日志打好。
    yumijie
        16
    yumijie  
    OP
       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
        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//'
    ```
    vincenttone
        18
    vincenttone  
       2016-02-18 16:06:01 +08:00   ❤️ 1
    @vincenttone 写错了文件名,是 cat 4.txt|sed 's/T.*Z//'
    不过看后缀似乎是 windows
    xuxu
        19
    xuxu  
       2016-02-18 16:16:23 +08:00   ❤️ 1
    preg_replace('#T[0-9\:]+Z#imu','',$str);
    $str 就是你的字符串。
    Xrong
        20
    Xrong  
       2016-02-18 18:23:36 +08:00
    如果量不大的话,直接用 vim 块选择,直接删除就好了
    Xrong
        21
    Xrong  
       2016-02-18 18:24:25 +08:00
    或者 vim 录制一个宏,也非常快
    terrancy
        22
    terrancy  
       2016-02-18 19:17:13 +08:00   ❤️ 1
    strpos() 这个函数可以获取指定的位置再截取就好了;不过上面的比较简单,每一行的长度都一样,T 和 Z 在字符串中的位置都固定的.通过位置截取指定长度也可以实现.数据量少的话正则的肯定更好.
    changlers
        23
    changlers  
       2016-02-18 19:48:10 +08:00   ❤️ 1
    preg_replace('/T[0-9:]+Z/i','',$object);
    lshero
        24
    lshero  
       2016-02-18 20:00:48 +08:00 via Android
    直接当 csv 处理不行嘛
    vibbow
        25
    vibbow  
       2016-02-18 21:18:33 +08:00   ❤️ 1
    其实直接 substr 就行了啊...
    hqs123
        26
    hqs123  
       2016-02-19 08:48:40 +08:00   ❤️ 1
    正则表达式可以
    a2231243
        27
    a2231243  
       2016-02-19 11:01:03 +08:00   ❤️ 1
    preg_replace('/T.*Z/', '', $str)
    helieting
        28
    helieting  
       2016-03-09 03:59:33 +08:00 via iPhone
    Vim 吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:40 · PVG 04:40 · LAX 12:40 · JFK 15:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.