2011-12-06 94 views
0

我有這個輸出(從另一個系統),我需要測試字段在一行。 這個愚蠢系統自動換行,在45個字符(與像30個空格每行之前)PHP查找單詞包裝線和unwordwrap

這是我的例子輸出(即我需要輸入)

     Name: 
         Pepsi 
         Test: 
         The Result was blah 
         and blah 
         Tester: 
         John 

         Name: 
         Sprite 
         Test: 
         The result was negative 
         Tester: 
         Jane 

         Etc etc 

測試後行有時:獲得自動換(有時不)
我需要該行是un-wordwrapped,所以我可以在訪問中導入它。

該文件大約2mb,並且有很多需要清理的實例。這就是爲什麼我試圖寫這個腳本。

感謝

----------------編輯-------------

這是我想出了迄今爲止。但我不能得到它來代替

<?php 
function replace_newline($string) { 
    return (string)str_replace(array("\r", "\r\n", "\n", "  ", " ", " ", " "), ' ', $string); 
} 

function GetBetween($content,$start,$end){ 

    $r = explode($start, $content); 

    foreach($r as $value){ 


     $t = explode($end, $value); //$t[0] between value 

     $result = trim(preg_replace('/[\t\r\n]+/', ' ', trim($t[0]))); 

     $result = trim($result); 
     $result = replace_newline($result); 
     if (!strstr($result, "Name:")) { 
      echo $result . "\r\n"; 
      $test = str_replace($t[0], $result, $test); 
     } 
    } 


} 
$test= file_get_contents("4321.txt"); 

GetBetween($test, "Test:", "Tester:"); 

?> 

此輸出:
結果是胡說和胡說
結果爲陰性

+0

30個空格是空格還是標籤? – hafichuk

+0

當你將這些行解開時,新添加的行應該按原樣添加還是在它們之間包含空格? –

+0

老實說,我會問服務器故障 - 有一些aw aw awk/sed的主人 – hafichuk

回答

0

這可能是不工作的代碼,但你的想法:

$cur = ""; 

foreach ($line as $l) 
{ 
    if (strpos($l, ':') !== FALSE) 
    { 
     // Keep track of a new chunk 
     if (!empty(trim($cur))) { /* Write old data if not empty */ } 

     // Start new chunk 
     $cur = trim($l); 
    } 

    // Not a new chunk, add to end of last one 
    $cur .= ' '. trim($l); 
} 

// Write the last chunk here 

// Close file 

你或許可以用一塊瘋狂的正則表達式來做這件事,但我沒有心情去解決它。


我知道我說我不會用正則表達式,但這裏有雲:

function getChunks($data) 
{ 
    // Clean up whitespace 
    $data = preg_replace('/\s+/', ' ', $data); 

    // Create an anchor point before the label word 
    $data = preg_replace('/\w+:/', '##\0', $data); 

    // Separate the data into chunks based on anchors 
    $sets = explode('##', $data); 

    // Keep any and all chunks that aren't empty 
    $sets = array_filter($sets, function($d) { return !empty(trim($d)); }); 

    // array_filter() can damage the indexing, so return just the values 
    return array_values($sets); 
} 

我沒有測試的代碼,但評論應該是一些指導。
請注意,這僅適用於以下情況:1)僅標籤包含分號和2)標籤只有一個字長。此外,您不會希望在海量的數據集上運行此操作。它沒有針對這種事情進行優化。它針對quick-n-dirty進行了優化。

+0

我已更新我的原始帖子。任何建議都會有幫助。 –

+0

我在這裏得到一個錯誤代碼: $ sets = array_filter($ sets,function($ d){return!empty(trim($ d));}); –

+0

該聲明使用匿名函數。如果您的PHP版本足夠老舊,則不支持該類型的語句,但您可以始終將該功能分開並按名稱調用。 –