我的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
)
答案 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 '/ |,/'