PHP 怎样去除中间字符串 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yumijie
V2EX    PHP

PHP 怎样去除中间字符串

  •  
  •   yumijie 2016-02-18 13:25:11 +08:00 4958 次点击
    这是一个创建于 3599 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     5427 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 06:38 PVG 14:38 LAX 22:38 JFK 01:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86