2009-12-18 169 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); 
相关问题