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

请教一个简单的正则提取问题

  •  
  •   cnqncom · 2018-03-06 15:39:27 +08:00 · 3045 次点击
    这是一个创建于 2452 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $re = '/"body":"(1+)",/';
    $str = '{"returnCode":"0","resultCode":"0","sign":"19333CD7F9710A104DA5D815709697D2","outChannelNo":"2017120100401000000017","status":"02","mchId":"000000010000000002","channel":"wxPubQR","body":"收单支付","outTradeNo":"20171201150337579753","amount":0.01,"transTime":"20171201150337"}';
    preg_match_all($re, $str, $matches);

    不仅需要提取 body,还要把 transTime 也提取出来。规则怎么写?
    15 条回复    2018-03-07 14:30:08 +08:00
    cnqncom
        1
    cnqncom  
    OP
       2018-03-06 15:39:54 +08:00
    $re = '/"Title":"([^"]+)",/';
    Telegram
        2
    Telegram  
       2018-03-06 15:53:57 +08:00 via iPhone
    标准 json,你为啥要用正则
    cnqncom
        3
    cnqncom  
    OP
       2018-03-06 16:10:27 +08:00
    @Telegram 只想提取里面的这两个值
    shifangjumie
        4
    shifangjumie  
       2018-03-06 16:32:26 +08:00
    json_decode 之后取不出来么?
    zhuzhuyule
        5
    zhuzhuyule  
       2018-03-06 16:46:47 +08:00
    一次匹配:
    ```
    reg1=/,\s*"body":"([^"]*)"[\w\W]*?,\s*"transTime":"([^"]*)"/
    ```

    循环匹配:
    ```
    reg2=/,\s*"(body|transTime)":"([^"]*)"/g
    ```
    symeonchen
        6
    symeonchen  
       2018-03-06 16:58:33 +08:00 via Android
    简单版本:
    ```
    "body":"[^"]+"
    ```

    ```
    "transTime":"[\w]+"
    ```
    正则不见得快多少,用 Json 解析更方便
    MuscleOf2016
        7
    MuscleOf2016  
       2018-03-06 17:00:25 +08:00
    推荐一个网站,妈妈再也不用怕我写正则了。
    http://www.txt2re.com/index-javascript.php3?s={%22returnCode%22:%220%22,%22resultCode%22:%220%22,%22sign%22:%2219333CD7F9710A104DA5D815709697D2%22,%22outChannelNo%22:%222017120100401000000017%22,%22status%22:%2202%22,%22mchId%22:%22000000010000000002%22,%22channel%22:%22wxPubQR%22,%22body%22:%22%26%2325910;%26%2321333;%26%2325903;%26%2320184;%22,%22outTradeNo%22:%2220171201150337579753%22,%22amount%22:0.01,%22transTime%22:%2220171201150337%22}&6
    VgV
        8
    VgV  
       2018-03-06 18:48:45 +08:00
    直接用 json_decode 就可以了呗,像调用数组那样。
    你不会写正则也许还会匹配错,但你直接用 json_decode 函数解出来再用数组调用就准确多了,
    除非你提供的字符串不是 json
    $arr = json_decode(字符串,true);
    print_r($arr);
    br00k
        9
    br00k  
       2018-03-06 23:47:30 +08:00
    正常路不走,非要走野路子。😂
    mingyun
        10
    mingyun  
       2018-03-06 23:49:53 +08:00
    fox0001
        11
    fox0001  
       2018-03-07 05:40:24 +08:00 via Android
    既然是标准 JSON 字符串,还是解析 JSON 方便,正则表达式提取要考虑格式变换(例如双引号变成单引号,空格增多或减少)的情况
    toxicant
        12
    toxicant  
       2018-03-07 10:46:07 +08:00
    对啊... json_decode 1 分钟能找到的东西 用正则还得去 v2 问。
    scriptB0y
        13
    scriptB0y  
       2018-03-07 11:24:04 +08:00
    用 json 库解析未必比 re 慢啊
    ericgui
        14
    ericgui  
       2018-03-07 11:41:35 +08:00
    理解不了为什么不用 json 解析。实在理解不了。
    crane2018
        15
    crane2018  
       2018-03-07 14:30:08 +08:00
    美特斯邦威:不走寻常路😆
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3718 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:10 · PVG 13:10 · LAX 21:10 · JFK 00:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.