字符串中截取部分内容问题请教
本帖最后由 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 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);
話說你這是真實資料嗎?
如果是的話要不要改一下?
感覺我都可以連去你的 FTP 了阿...
=> ***.***.***.***
=> 1
=> ****
=> 0
=> admin****
=> fas**** Closer 发表于 2014-12-16 15:06
話說你這是真實資料嗎?
如果是的話要不要改一下?
感覺我都可以連去你的 FTP 了阿...
呵呵,问题我已经解决了,虽然没有采纳你的,但是还是很感谢的,关于是否是真实的,你连上试试不就知道了,感谢
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: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";
}
}
}
不好意思,問題有點多~
最近有用這種資料型態
$text = "0/0/0,0/0/0,0/0/0";
這是三種類型的資料,而個別都有其設定值
希望解析完的型態是這樣
array
{
=>array
{
=>0
=>0
=>0
}
=>array
{
=>0
=>0
=>0
}
=>array
{
=>0
=>0
=>0
}
}
該用甚麼方式解析?
Closer 发表于 2014-12-18 09:16
感謝提供
正規式不熟
//尋找格式 " *|*|*|{*}|* " ,為什麼最後一個不用 " (.*?) "
貪有時,不貪有時。
要貪不要貪,要看時機!
//尋找格式 " {*} ",^ 和 $ 不知道用意
最基本的東西,不答了!自己去找吧!
//查過語法功能是刪除第一個陣列,並往前推進,但在此的用意是?
漂亮些!
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, '/'));
}
?>
學邏輯,但亦要學會使用工具。
知識有價,多花時間看手冊吧!
燃雲 发表于 2014-12-19 08:14
以正則進行。
感謝指教!
英文不太好,手冊找的頭疼
有的又寫得太學術了
第一眼看到不知道是自己要的
今天學了個 CSV
页:
[1]
2