木浪——hd 发表于 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。。。。。求解

Closer 发表于 2014-12-16 14:48:33

本帖最后由 Closer 于 2014-12-16 15:16 编辑

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

//數據輸入前請過濾沒有雙引號與 : 號
//不然會過濾錯誤

$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] = $break;
    }
  }
}

echo '<pre>';
print_r($break_ok);
echo '</pre>';


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

 

Closer 发表于 2014-12-16 15:06:24

話說你這是真實資料嗎?
如果是的話要不要改一下?
感覺我都可以連去你的 FTP 了阿...

    => ***.***.***.***
    => 1
    => ****
    => 0
    => admin****
    => fas****

木浪——hd 发表于 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

$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";
      }
    }
}

?>


Closer 发表于 2014-12-18 09:16:53

本帖最后由 Closer 于 2014-12-18 09:44 编辑

燃雲 发表于 2014-12-17 22:34
這樣做是相當的難!

簡單點吧!
感謝提供

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

static/image/hrline/line3.png

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


//尋找格式 " *|*|*|{*}|* " ,為什麼最後一個不用 " (.*?) "
$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";
      }
    }
}

Closer 发表于 2014-12-18 09:49:03

不好意思,問題有點多~
最近有用這種資料型態

$text = "0/0/0,0/0/0,0/0/0";

這是三種類型的資料,而個別都有其設定值
希望解析完的型態是這樣

array
{
  =>array
    {
      =>0
      =>0
      =>0
    }
  =>array
    {
      =>0
      =>0
      =>0
    }
  =>array
    {
      =>0
      =>0
      =>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

$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 as $match)
    {
      if (preg_match_all($sub_pattern, $match, $sub_matches))
      {
            array_shift($sub_matches);
            print_r($sub_matches);
      }
    }
}
?>


但這太煩了!

簡單點!

<?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, '/'));
}
?>


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

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

Closer 发表于 2014-12-19 09:24:13

燃雲 发表于 2014-12-19 08:14
以正則進行。




感謝指教!

英文不太好,手冊找的頭疼
有的又寫得太學術了
第一眼看到不知道是自己要的
今天學了個 CSV
页: [1] 2
查看完整版本: 字符串中截取部分内容问题请教