2009-12-18 61 views
1

我有一個php變量來自需要整理的表單。我希望你能幫忙。將一個複雜的字符串轉換爲一個數組在php

該變量包含項目列表(可能包含兩個或三個單詞項之間的空格)。 我想將它轉換爲逗號分隔的列表,沒有多餘的空白。我希望各部門只能以逗號,分號或換行符號落下。空白不能是一個項目。

這裏有一個完整的例子(有故意凌亂輸入):

Variable In: "dog, cat   ,car,tea pot,, ,,, ;;(++NEW LINE++)fly,  cake" 
Variable Out "dog,cat,car,tea pot,fly,cake" 

誰能幫助?

回答

10

您可以通過分割字符串爲 「有用」 的部分開始,隨着preg_split裏,然後,implode這些部件一起回來

$str_in = "dog, cat   ,car,tea pot,, ,,, ;; 
fly,  cake"; 

$parts = preg_split('/[,;\s]/', $str_in, -1, PREG_SPLIT_NO_EMPTY); 

$str_out = implode(',', $parts); 

var_dump($parts, $str_out); 

(在這裏,正則表達式會分割爲',',';'和'\s',表示任何空格字符 - 並且我們只保留非空白部分)

會得到你,爲$parts

array 
    0 => string 'dog' (length=3) 
    1 => string 'cat' (length=3) 
    2 => string 'car' (length=3) 
    3 => string 'tea' (length=3) 
    4 => string 'pot' (length=3) 
    5 => string 'fly' (length=3) 
    6 => string 'cake' (length=4) 

而且,對於$str_out

string 'dog,cat,car,tea,pot,fly,cake' (length=28) 


評論後

編輯:對不起,我沒注意一個^^

在這種情況下,你不能用空格分開:-(我可能會通過「,」或「;」分裂,遍歷部分,採用trim之初,除去白色字符,每個項目的結束,只保留那些不爲空:

$useful_parts = array(); 
$parts = preg_split('/[,;]/', $str_in, -1, PREG_SPLIT_NO_EMPTY); 
foreach ($parts as $part) { 
    $part = trim($part); 
    if (!empty($part)) { 
     $useful_parts[] = $part; 
    } 
} 
var_dump($useful_parts); 


執行的代碼,這部分讓我:

array 
    0 => string 'dog' (length=3) 
    1 => string 'cat' (length=3) 
    2 => string 'car' (length=3) 
    3 => string 'tea pot' (length=7) 
    4 => string 'fly' (length=3) 
    5 => string 'cake' (length=4) 


而爆都在一起,我得到的,此時:

string 'dog,cat,car,tea pot,fly,cake' (length=28) 

哪個更好;-)

+0

這是一個很好的答案。你如何將「茶壺」作爲最終名單上的一個項目? – 2009-12-18 19:42:11

+0

@帕特里克:我用第二個想法編輯了我的答案 - 沒有完全注意到這種情況^^ – 2009-12-18 19:53:54

+0

這個效果很好。比你非常。 – 2009-12-19 14:11:31

1

你可以使用explodetrimstr_replace得到陣列,手動刪除特定的字符,然後把它變回一個數組。

function getCleanerStringFromString($stringIn) { 
    ///turn the string into an array with a comma as the delimiter 
    $myarray = explode(",",$stringin); 

    for ($ii =0; $ii < count($myarray); $ii++) { 
     ///remove new lines, semi colons, etc 
     ///use this line as many times as you'd like to take out characters 
     $myarray($ii) = str_replace(";","",$myarray($ii); 


     ////remove white spaces 
     $myarray($ii) = trim($myarray($ii)); 

    } 

    //then turn it back into an array: 
    $backstring = implode(","$myarray); 

    return $backstring; 
} 
1

爆炸的逗號整個字符串,通過該數組行走,第一匹配不是-ZA-Z0-9(和空間)的所有字符,然後修整剩餘前/後間隔。如果爲空,請從陣列中取消設置。 Implode回到一個字符串。

理想情況下,允許更多的雜亂字符不僅僅是; \ S \ n等

$strIn = "dog, cat   ,car,tea pot,, ,,, ;;(++NEW LINE++)fly,  cake"; 
$firstArray = explode(",", $strIn); 

$searchPattern = "/[^A-Za-z0-9 ]+/"; 

function removeViolators($item, $key) { 
    preg_replace($searchPattern, "", $item); 
    trim($item); 
    if (empty($item)) { 
     unset($item); 
    } 
} 

array_walk($firstArray, removeViolators); 
$strOut = implode(",", $firstArray); 
1

拆分然後grep的,似乎得到所需要的輸出:

$array = preg_split('/\s*[;,\n]\s*/', $string); 
$array = preg_grep('/^\s*$/', $array, PREG_GREP_INVERT); 
$string = implode(',', $array); 

編輯:實際上grep不是必需的:

$array = preg_split('/\s*[;,\n]\s*/', $string, -1, PREG_SPLIT_NO_EMPTY); 
$string = implode(',', $array); 
相關問題