2012-05-21 93 views
0

我正在使用API​​發送一串信息,並由未定義數量的空格分隔。當我嘗試將它爆炸時,我最終會得到一些僅由空間組成的元素。我試過用foreach,preg_replace,preg_match,幾乎所有我能找到的擺脫這些空間的東西,但還是有一些遺留的,奇怪的是,即使我用另一個符號替換這些空格,然後爆炸字符串並移除僅由此符號組成的元素,則僅保留空間元素。此外,任何刪除它們的方法都會刪除一些,但通常在包含有用信息的每個陣列位置之間存在2或3個。從爆炸字符串中刪除垃圾信息

示例:我收到一個字符串,它看起來像這樣(我使用//分離元件):

// // // // // // // //// // 1000 // // // // // // // // // // // // // // 0 // // // // // // // // // // 1 // //// // // // // // // // 1 // // // // // 101 // // // // // // // // // 272 // // // // // //// // // //ubuntu-10.04-x86 // // // //基本// // // // // // // // // true // // // //運行// // // // // 0 // // // // // // // // // // // // // // 1000 // // // // // // // // // //// // // // 0 // // // // // // // // // // 1 // // // // // // // // 2 // // // //// 102 // // // // // // // // // 272 // // // // // // // // //ubuntu-10.04-x86 // // // //基本//// // // // // // // true // // // //運行// // // // 0 // // // // // // // // //// // // // // 1000 // // // // // // // // // // // // // 0 // // // // // // // // // 1 // // // // // // // // // 3 // // // // 103 // // // // // // // // // 0 // //// // // // // // //ubuntu-10.04-x86 // // // // vswap-256m // // // // // // // // // false // //// // //停止 // // // // // // //

當我做

$result = preg_replace('/\s[\s]+/', '-', $result); 
$result = preg_split('~-~', $result, -1, PREG_SPLIT_NO_EMPTY); 

foreach($result as $item){ 
    echo "$item //"; 
} 

例如,我結束了這一點:

// // // 1000 // // // 0 // // 1 // // 1 // 101 // // 272// // ubuntu //10.04 // x86 // basic // // true //正在運行// 0 // // // // // 1000 // // // 0 // // 1 // // // ///2 // 102 // // 272 // // ubuntu //10.04 // x86 //基本// // true //正在運行// 0 // // // // // 1000 // // //// 0 // // 1 // // 3 // 103 // // 0 // // ubuntu //10.04 // x86 // vswap // 256m // // false // stopped // // //

任何人都知道我如何擺脫那些空的元素從陣列?

+1

可以修改API?這是一團糟! – ManseUK

+2

我不行。我認爲它也很雜亂,但這就是生活,我猜... – Tuma

回答

3

您可以使用array_filter根據您自己的標準過濾元素。

$result = array_filter($result, 
         function($e) { return trim($e) != ''; }); 
+0

我得到一個版本問題。我這個php5.3? – Tuma

+0

是的,從5.3開始,匿名函數在PHP中。它應該和5.4一樣。對於舊版本的PHP(由於安全錯誤不再被修復,所以沒人應該使用),您必須創建一個常規函數並傳遞給array_filter。 –

0

先取下空元素:

$str = preg_replace('%//\s+%', '', $str); 

這將刪除字符串//<space>

example here

1

我可能失去了一些東西,但你不能只:

$array = preg_split('/\s\s+/', $input, 0, PREG_SPLIT_NO_EMPTY); 

Like this

+0

只有'\ s +'(而不是'\ s \ s +')應該這樣做,如果數據真的只用空格分隔。 – raina77ow

+0

@ raina77ow'\ s \ s +'將解釋數據可能包含單個空白字符的事實。雖然如果它永遠不會包含一個,那麼你是正確的。 – DaveRandom

+0

那麼,使用空格作爲可能包含空格的數據的分隔符是非常奇怪的 - 並且沒有其他標記數據的方法(例如雙引號)。 )但我明白你的觀點。 – raina77ow

0

嘗試

$match = array(); 
preg_match_all ('/[^\s]+/' , $result, $matches); 
print_r($match); 
0
// Where $str is the crazy string.  
$fixed = preg_replace('/\s/', '', $str); 
$result = preg_split('~//~', $fixed, -1, PREG_SPLIT_NO_EMPTY); 
var_export($result);