用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3449|回复: 10
收起左侧

字符串中截取部分内容问题请教

[复制链接]
发表于 2014-12-16 13:54:17 | 显示全部楼层 |阅读模式
本帖最后由 Closer 于 2014-12-19 16:48 编辑

现在有这样一串字符串(日志内容,每一条格式一样,我要读取每一条,获取其中部分数据,应该怎样取呢?)下面是其中一条:

2014-12-15 00:22:17 2932675381|0|任务信息获取成功|{"task_id":"22365","task_name":"\u7ad9\u957f\u5206\u4eab\u535a\u5ba2","user_id":"36723","target_host":"122.114.48.217","ftp_type":"1","ftp_port":"21","ftp_mode":"0","ftp_user":"administrator","ftp_passwd":"fasdode520","target_dir":null,"backup_dir":"\/youwujun","domain_name":"","freqence":"1","time_zone":null,"start_time":"2","back_time":"1402640307","last_backup_time":"1418573343","backup_count":"76","status_code":"0","cur_size":"8060713888","storeprovider":"99","flag":"5","extra_flag":"1","server_name":"NODE_ALIYUN_BJ_03","backup_node_name":null,"is_push":"0","is_ssl":"0","is_proxy":"0","pair_task_id":null,"create_time":"1402467444","update_time":"1418573343","ip_change_time":"1402467444","last_history_id":"990306","last_msg_type":"2","bus_type":"9","store_frequency":"2","sitestype":"2","sites_type":"1","ap_mp":"0","ext_info":null,"websize":"1","group_id":"33290","speed_level":"1","back_now":"0","open_web_scan":"0","history_max":"6"}|123.57.7.52


我需要得到其中部分内容,比如说日期,ip ,last_backup_time。。。。。求解

发表于 2014-12-16 14:48:33 | 显示全部楼层
本帖最后由 Closer 于 2014-12-16 15:16 编辑

其實不難,就是檢查/分割/過濾...檢查/分割/過濾......
然後存入變數成為一個陣列

PHP复制代码
 
//數據輸入前請過濾沒有雙引號與 : 號
//不然會過濾錯誤
 
$data_test = '(你的值)';
$break_ok = array();//宣告陣列
$test = explode("|", $data_test);
$max_test = count($test);
 
for($x=0;$x<$max_test;$x++){
  $chk = substr($test[$x], -1);//取得字串最後一碼
  if($chk=="}"){
    $test[$x] = str_replace('{','',$test[$x]);//刪除字串內 { 號
    $test[$x] = str_replace('}','',$test[$x]);//刪除字串內 } 號
    $test[$x] = str_replace('"','',$test[$x]);//刪除字串內 " 號
    //$data_test = "task_id:22365,user_id:36723,.......";
    $arrayData = explode(",", $test[$x]);
    $max_arrayData = count($arrayData);
    for($y=0;$y<$max_arrayData;$y++){
      $break = explode(":",$arrayData[$y]);
      $break_ok[$break[0]] = $break[1];
    }
  }
}
 
echo '<pre>';
print_r($break_ok);
echo '</pre>';
 
复制代码


如果你怕過濾掉原始數據的 " { }
也可以用 substr 去頭去尾的方式來過濾資料
$del_1 = substr($test[$x], -1);
$del_2 = substr($del_1, 0, 1);

 
发表于 2014-12-16 15:06:24 | 显示全部楼层
話說你這是真實資料嗎?
如果是的話要不要改一下?
感覺我都可以連去你的 FTP 了阿...

    [target_host] => ***.***.***.***
    [ftp_type] => 1
    [ftp_port] => ****
    [ftp_mode] => 0
    [ftp_user] => admin****
    [ftp_passwd] => fas****
 楼主| 发表于 2014-12-16 20:39:24 | 显示全部楼层
Closer 发表于 2014-12-16 15:06
話說你這是真實資料嗎?
如果是的話要不要改一下?
感覺我都可以連去你的 FTP 了阿...

呵呵,问题我已经解决了,虽然没有采纳你的,但是还是很感谢的,关于是否是真实的,你连上试试不就知道了,感谢

发表于 2014-12-17 22:34:00 | 显示全部楼层
Closer 发表于 2014-12-16 14:48
其實不難,就是檢查/分割/過濾...檢查/分割/過濾......
然後存入變數成為一個陣列

這樣做是相當的難!

簡單點吧!

PHP复制代码
 
<?php
 
$log_record = '2014-12-15 00:22:17 2932675381|0|任务信息获取成功|{"task_id":"22365","task_name":"\u7ad9\u957f\u5206\u4eab\u535a\u5ba2","user_id":"36723","target_host":"122.114.48.217","ftp_type":"1","ftp_port":"21","ftp_mode":"0","ftp_user":"administrator","ftp_passwd":"fasdode520","target_dir":null,"backup_dir":"\/youwujun","domain_name":"","freqence":"1","time_zone":null,"start_time":"2","back_time":"1402640307","last_backup_time":"1418573343","backup_count":"76","status_code":"0","cur_size":"8060713888","storeprovider":"99","flag":"5","extra_flag":"1","server_name":"NODE_ALIYUN_BJ_03","backup_node_name":null,"is_push":"0","is_ssl":"0","is_proxy":"0","pair_task_id":null,"create_time":"1402467444","update_time":"1418573343","ip_change_time":"1402467444","last_history_id":"990306","last_msg_type":"2","bus_type":"9","store_frequency":"2","sitestype":"2","sites_type":"1","ap_mp":"0","ext_info":null,"websize":"1","group_id":"33290","speed_level":"1","back_now":"0","open_web_scan":"0","history_max":"6"}|123.57.7.52';
 
$log_pattern = '/(.*?)\|(.*?)\|(.*?)\|(\{.*\})\|(.*)/';
$json_pattern = '/^\{.*\}$/';
 
if (preg_match($log_pattern, $log_record, $matches))
{
    array_shift($matches);
 
    foreach ($matches as $match)
    {
        if (preg_match($json_pattern, $match))
        {
            print_r(json_decode($match));
        }
        else
        {
            echo $match, "\n";
        }
    }
}
 
?>
 
复制代码


发表于 2014-12-18 09:16:53 | 显示全部楼层
本帖最后由 Closer 于 2014-12-18 09:44 编辑
燃雲 发表于 2014-12-17 22:34
這樣做是相當的難!

簡單點吧!

感謝提供

正規式不熟
所以實際還沒怎麼應用上



我是這樣理解的,麻煩幫我看看對不對


PHP复制代码
 
//尋找格式 " *|*|*|{*}|* " ,為什麼最後一個不用 " (.*?) "
$log_pattern = '/(.*?)\|(.*?)\|(.*?)\|(\{.*\})\|(.*)/';
//尋找格式 " {*} ",^ 和 $ 不知道用意
$json_pattern = '/^\{.*\}$/';
 
if (preg_match($log_pattern, $log_record, $matches))
{
    array_shift($matches);//查過語法功能是刪除第一個陣列,並往前推進,但在此的用意是?
 
    foreach ($matches as $match)
    {
        if (preg_match($json_pattern, $match))
        {
            print_r(json_decode($match));//因為是 json 格式,所以用 json_decode 解析
        }
        else
        {
            echo $match, "\n";
        }
    }
}
 
复制代码
发表于 2014-12-18 09:49:03 | 显示全部楼层
不好意思,問題有點多~
最近有用這種資料型態
PHP复制代码
 
$text = "0/0/0,0/0/0,0/0/0";
 
复制代码

這是三種類型的資料,而個別都有其設定值
希望解析完的型態是這樣
PHP复制代码
 
array
{
  [0]=>array
    {
      [0]=>0
      [1]=>0
      [2]=>0
    }
  [1]=>array
    {
      [0]=>0
      [1]=>0
      [2]=>0
    }
  [2]=>array
    {
      [0]=>0
      [1]=>0
      [2]=>0
    }
}
 
复制代码

該用甚麼方式解析?


 
发表于 2014-12-19 08:08:42 | 显示全部楼层
Closer 发表于 2014-12-18 09:16
感謝提供

正規式不熟
//尋找格式 " *|*|*|{*}|* " ,為什麼最後一個不用 " (.*?) "

貪有時,不貪有時。

要貪不要貪,要看時機!

//尋找格式 " {*} ",^ 和 $ 不知道用意

最基本的東西,不答了!自己去找吧!
//查過語法功能是刪除第一個陣列,並往前推進,但在此的用意是?

漂亮些!
发表于 2014-12-19 08:14:14 | 显示全部楼层
Closer 发表于 2014-12-18 09:49
不好意思,問題有點多~
最近有用這種資料型態

以正則進行。
PHP复制代码
 
<?php
 
$text = "0/0/0,0/0/0,0/0/0";
 
$pattern = '/((?:[[:digit:]]+)\/(?:[[:digit:]]+)\/(?:[[:digit:]]+))(?:,|$)/';
$sub_pattern = '/([[:digit:]]+)(?:\/|$)/';
 
if (preg_match_all($pattern, $text, $matches))
{
    array_shift($matches);
    print_r($matches);
 
    foreach ($matches[0] as $match)
    {
        if (preg_match_all($sub_pattern, $match, $sub_matches))
        {
            array_shift($sub_matches);
            print_r($sub_matches);
        }
    }
}
?>
 
复制代码


但這太煩了!

簡單點!
PHP复制代码
 
<?php
 
$text = "0/0/0,0/0/0,0/0/0";
 
$sub_texts = str_getcsv($text, ',');
 
foreach ($sub_texts as $sub_text)
{
    print_r(str_getcsv($sub_text, '/'));
}
?>
 
复制代码


學邏輯,但亦要學會使用工具。

知識有價,多花時間看手冊吧!

评分

参与人数 1威望 +5 收起 理由
Closer + 5 赞一个!

查看全部评分

发表于 2014-12-19 09:24:13 | 显示全部楼层

感謝指教!

英文不太好,手冊找的頭疼
有的又寫得太學術了
第一眼看到不知道是自己要的
今天學了個 CSV

本版积分规则