在php中将复杂的字符串转换为数组

时间:2009-12-18 19:34:02

标签: php regex

我有一个 php 变量来自需要整理的表单。我希望你能提供帮助。

变量包含一个项目列表(可能是两个或三个单词项目,单词之间有空格)。 我想将它转换为逗号分隔列表,没有多余的空格。我希望这些分歧只落在逗号,分号或新行上。空白不能是项目。

这是一个全面的例子(有故意的混乱输入):

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

有人可以帮忙吗?

4 个答案:

答案 0 :(得分: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)



评论后编辑:抱歉,我没注意到一个^^

在这种情况下,你不能用空格分割:-(我可能会被','或';'拆分,使用 {迭代这些部分{3}} 删除每个项目开头和结尾的白色字符,并仅保留非空白字符:

$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)

哪个更好; - )

答案 1 :(得分:1)

您可以使用explodetrim以及str_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;
}

答案 2 :(得分:1)

在逗号上分解整个字符串,遍历该数组,首先匹配所有不是a-zA-Z0-9(和空格)的字符,然后修剪剩余的前导/尾随空格。如果为空,则取消设置数组中的项目。内爆回到一个字符串。

理想情况下,这允许更多杂乱的字符而不仅仅是; \ 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);

答案 3 :(得分: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);