php sscanf没有正确解析字符串

时间:2014-09-09 13:21:30

标签: php parsing scanf adif

我开发ADIF解析器并且解析过程到了我使用sscanf()php函数的地方我解析的strind如下:“QSO_DATE:8:D> 20070909”我需要从这里绘制信息如下:“QSO_DATE”,“8”,“20070909”所以我使用代码:

sscanf("QSO_DATE:8:D>20070909", "%s:%d:D>%d")

但返回数组看起来像这样:

    Array
(
    [0] => QSO_DATE:8:D>20070909
    [1] => 
    [2] => 
)

有什么问题?也许有更有效的方法来解析这些记录:

<CALL:7>EM200FT<QSO_DATE:8:D>20140324<TIME_ON:4>1657<BAND:3>12M<MODE:5>PSK63<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<APP_EQSL_AG:1>Y<GRIDSQUARE:6>KN45kj<EOR>
<CALL:5>9V1SV<QSO_DATE:8:D>20140328<TIME_ON:4>1019<BAND:3>10M<MODE:4>JT65<RST_SENT:6>VK4CMV<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<QSLMSG:54>Thank you and I confirm your SWL report, 73's de Siva.<APP_EQSL_AG:1>Y<GRIDSQUARE:6>OJ11ui<EOR>
<CALL:5>RA6DQ<QSO_DATE:8:D>20140328<TIME_ON:4>1019<BAND:3>10M<MODE:4>JT65<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<QSLMSG:3>73!<APP_EQSL_AG:1>Y<GRIDSQUARE:6>KN85nf<EOR>

1 个答案:

答案 0 :(得分:2)

%s表示任何字符,包括冒号,数字,V形符号等,除了空格字符)和sscanf使用贪婪的抓取....使用更精确的替代方案,如%[A-Z_]或{{1}可能会为%[^:]

提供更好的服务
%s

使用$result = sscanf("QSO_DATE:8:D>20070909", "%[^:]:%d:D>%d"); var_dump($result); 扫描%[^:]

以外的任何字符