当字符串有多个空格时,PHP会将字符串分解为带空格分隔符的数组吗?

时间:2016-02-15 21:00:22

标签: php

我的PHP代码会将字符串分解为数组。它允许使用多个分隔符来检测数组值应该来自字符串的位置。

在演示中,其中一个分隔符值是一个空格。问题是如果字符串有超过1个连续的空格,它将生成空数组值。

例如key key2 key3 key4将使用:

生成数组
Array
(
    [0] => key
    [1] => key2
    [2] => key3
    [3] => 
    [4] => key4
)

,所需的输出是:

Array
(
    [0] => key
    [1] => key2
    [2] => key3
    [4] => key4
)

我该如何解决这个问题?

/**
 * Explode a string into array with multiple delimiters instead of the default 1 delimeter that explode() allows!
 * @param  array $delimiters - array(',', ' ', '|') would make a string with spaces, |, or commas turn into array
 * @param string $string  text with the delimeter values in it that will be truned into an array
 * @return array - array of items created from the string where each delimiter  in string made a new array key
 */
function multiexplode ($delimiters, $string) {
    $ready = str_replace($delimiters, $delimiters[0], $string);
    $array = explode($delimiters[0], $ready);
    $array = array_map('trim', $array);
    return  $array;
}

$tagsString  = 'PHP JavaScript,WebDev Apollo   jhjhjh';
$tagsArray = multiexplode(array(',',' '), $tagsString);
print_r($tagsArray);

输出数组

Array
(
    [0] => PHP
    [1] => JavaScript
    [2] => WebDev
    [3] => Apollo
    [4] => 
    [5] => 
    [6] => jhjhjh
)

3 个答案:

答案 0 :(得分:11)

您可以使用preg_split()解决问题并简化代码。您可以在character class中使用quantifier\s*应用包含所有分隔符的正则表达式,以消耗分隔符周围的空格。

代码:

$array = preg_split("/\s*[" . preg_quote(implode("", $delimiters), "/") . "]+\s*/", $str);
                      └┬┘└────────────────────────┬─────────────────────────┘└┬┘ 
      Consuming any whitespaces                   │             Consuming any whitespaces 
      around delimiter                            │             around delimiter
                                   ┌──────────────┘
                                   ├ []           → Character class with quantifier
                                   ├ implode()    → Converting array into a string
                                   └ preg_quote() → Escaping special characters

答案 1 :(得分:2)

您也可以使用:

array_filter($tagsArray);

或使用:

array_diff( $tagsArray, array( '' ));

答案 2 :(得分:0)

已经有一个有效的preg_split()答案,但使用PREG_SPLIT_NO_EMPTY可能更灵活:

$tagsArray = preg_split('/[ ,]/', $tagsString, null, PREG_SPLIT_NO_EMPTY);  // or '/ |,/'