2012-06-06 98 views
3

如何在php下解析並顯示下面的文本並將其輸出到hmtl中?如何在php中解析固定寬度的列文本?

我需要的是提示如何接近分隔列的空間。空格的數量不固定,所以我不能使用explode(" ",$string);而且我不確定下面的輸出結構是否真的有固定寬度的列。我想使解析函數通用。

輸出來自db2 list applications

Auth Id Application Appl.  Application Id             DB  # of 
     Name   Handle                 Name Agents 
-------- -------------- ---------- -------------------------------------------------------------- -------- ----- 
DB2INST1 db2jcc_applica 11446  10.0.0.209.51406.120606004531         WEI  1  
DB2INST1 db2jcc_applica 11448  10.0.0.209.51407.120606004536         WEI  1  
DB2INST1 db2jcc_applica 13762  10.0.0.206.57473.120606024909         DOM_BUGS 1  
ADMIN db2jcc_applica 15220  10.0.0.210.52248.120606045402         RATIONAL 1  
DB2INST1 php-fpm: pool 16546  127.0.0.2.35530.120606065726         KON  1  
DB2INST1 db2jcc_applica 16547  10.0.0.202.52042.120606065813         KON  1 

回答

2

您可以preg_split通過空間

$words = preg_split("/[\s]+/", $input); 

//if your lines seperated by `\n` new line you could: 
$inputArr = preg_split("/\R+/", $input); 
foreach($inputArr as $value) { 
    $out = preg_split("/\s+/", $value); 
    var_dump($out); 
} 

Thanks 
+1

+1可以先通過''/ \ r preg_split' + /'來獲取行(\ r爲unicod安全新行)然後按'/ \ s + /'(你不需要大括號) – Teneff

+0

很好地工作。謝謝。 – Radek

+0

@Teneff謝謝更新 –

1

你可以在每條數據線使用preg_match這樣:

preg_match('~^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$~', $line, &$matches); 

如果不是這將返回1如果匹配,0。 和 - 更重要的 - 在$matches列的內容,如下所示:

array (
    0 => 'DB2INST1 db2jcc_applica 11446  10.0.0.209.51406.120606004531', 
    1 => 'DB2INST1', 
    2 => 'db2jcc_applica', 
    3 => '11446', 
    4 => '10.0.0.209.51406.120606004531', 
) 

的圖案簡單地匹配由空格的序列中分離出來的非空白的序列。所以只要數據本身沒有空白,這應該適用於任何隨機列長度。

3

首先,有sscanf

$vars = sscanf($string, '%s %s %d %s'); 

它是爲空格分隔值優化,你已經可以指定變量類型(%s =字符串; %d =整數)(;甚至命名變量,但在示例中沒有演示)。

例/ Demo

$lines = explode("\r\n", $input); 

foreach($lines as &$line) 
{ 
    $line = sscanf($line, '%s %s %d %s'); 
} 

var_dump($lines); 

輸出:

array(6) { 
    [0]=> 
    array(4) { 
    [0]=> 
    string(8) "DB2INST1" 
    [1]=> 
    string(14) "db2jcc_applica" 
    [2]=> 
    int(11446) 
    [3]=> 
    string(29) "10.0.0.209.51406.120606004531" 
    } 
    [1]=> 
    array(4) { 
    [0]=> 
    string(8) "DB2INST1" 
    [1]=> 
    string(14) "db2jcc_applica" 
    [2]=> 
    int(11448) 
    [3]=> 
    string(29) "10.0.0.209.51407.120606004536" 
    } 
    [2]=> 
    array(4) { 
    [0]=> 
    string(8) "DB2INST1" 
    [1]=> 
    string(14) "db2jcc_applica" 
    [2]=> 
    int(13762) 
    [3]=> 
    string(29) "10.0.0.206.57473.120606024909" 
    } 
    [3]=> 
    array(4) { 
    [0]=> 
    string(5) "ADMIN" 
    [1]=> 
    string(14) "db2jcc_applica" 
    [2]=> 
    int(15220) 
    [3]=> 
    string(29) "10.0.0.210.52248.120606045402" 
    } 
    [4]=> 
    array(4) { 
    [0]=> 
    string(8) "DB2INST1" 
    [1]=> 
    string(8) "php-fpm:" 
    [2]=> 
    NULL 
    [3]=> 
    NULL 
    } 
    [5]=> 
    &array(4) { 
    [0]=> 
    string(8) "DB2INST1" 
    [1]=> 
    string(14) "db2jcc_applica" 
    [2]=> 
    int(16547) 
    [3]=> 
    string(29) "10.0.0.202.52042.120606065813" 
    } 
} 
+0

它看起來比preg_split(「/ [\ s] + /」,$ input)更簡單; – Radek

+0

正如所寫,它已被用於格式化的字符串解析。單個空間代表一個或多個空間。有一天,我會寫一篇關於它的更長的博客文章,因爲它不是很知道,但真的有一些方便的功能。 – hakre

+0

請注意,您的示例對於「應用程序名稱」=「php-fpm:pool」無法正常工作。請注意應用程序名稱中的空格。如果你檢查你的演示,那麼你會發現第二個元素的最後一行元素的索引爲2和3爲null。它不應該爲空,而是16546和127.0.0.2.35530.120606065726。任何想法如何解決這個問題? – Radek

1

下面是一篇文章,將幫助你。

//To parse an example like the following categorized columns: 
/* 
col1   col2 col3 
====   ==== ==== 
1 a b c d e 103  14 as d9 
2 a   103  14 as d9 
3 a   103  14 as d9 
*/ 



$headings = array('col1','col2','col3'); 
$header = "col1 col2 col3"; 
//get the $heading_pos_list by parsing the headings of each column with 
list($heading_pos_list, $lengths) = parse_heading($headings, $header); 
//Parse each line into a row structure 
$start_position = $heading_pos_list[0][$heading_key]; 
$length_of_heading = $heading_pos_list[1][$heading_key]; 
$line = '1 a b c d e 103 14 as d9'; 
$row = parse_line($line, $headings, $start_position, $length_of_heading); 
//this works for each column and line 
echo $row('col1'); 
//output: 
//1 a b c d e 
//continue on for each line. 

你可以找到這篇文章在這裏這些功能: http://boulderapps.co/parsing-unevenly-spaced-columns-from-text-in-php