$str = "This is a string";
$words = explode(" ", $str);
工作正常,但空格仍然进入数组:
$words === array ('This', 'is', 'a', '', '', '', 'string');//true
我希望只有没有空格的单词,并保留空格数的信息。
$words === array ('This', 'is', 'a', 'string');//true
$spaces === array(1,1,4);//true
刚添加:(1, 1, 4)
表示第一个单词后面的一个空格,第二个单词后面的一个空格和第三个单词后面的4个空格。
有没有办法快速完成?
谢谢。
答案 0 :(得分:29)
要将String拆分为数组,您应该使用preg_split:
$string = 'This is a string';
$data = preg_split('/\s+/', $string);
你的第二部分(计算空格):
$string = 'This is a string';
preg_match_all('/\s+/', $string, $matches);
$result = array_map('strlen', $matches[0]);// [1, 1, 4]
答案 1 :(得分:2)
这是一种方法,拆分字符串并运行一次正则表达式,然后解析结果以查看哪些段被捕获为拆分(因此只有空格),或者哪些是单词:
$temp = preg_split('/(\s+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$spaces = array();
$words = array_reduce( $temp, function( &$result, $item) use ( &$spaces) {
if( strlen( trim( $item)) === 0) {
$spaces[] = strlen( $item);
} else {
$result[] = $item;
}
return $result;
}, array());
您可以看到$words
的{{3}}:
Array
(
[0] => This
[1] => is
[2] => a
[3] => string
)
$spaces
是:
Array
(
[0] => 1
[1] => 1
[2] => 4
)
答案 2 :(得分:1)
您可以将preg_split()
用于第一个数组:
$str = 'This is a string';
$words = preg_split('#\s+#', $str);
preg_match_all()
数组的$spaces
:
preg_match_all('#\s+#', $str, $m);
$spaces = array_map('strlen', $m[0]);
答案 3 :(得分:1)
另一种方法是使用foreach循环。
$str = "This is a string";
$words = explode(" ", $str);
$spaces=array();
$others=array();
foreach($words as $word)
{
if($word==' ')
{
array_push($spaces,$word);
}
else
{
array_push($others,$word);
}
}
答案 4 :(得分:1)
$financialYear = 2015-2016;
$test = explode('-',$financialYear);
echo $test[0]; // 2015
echo $test[1]; // 2016
答案 5 :(得分:0)
以下是性能测试的结果:
$str = "This is a string";
var_dump(time());
for ($i=1;$i<100000;$i++){
//Alma Do Mundo - the winner
$rgData = preg_split('/\s+/', $str);
preg_match_all('/\s+/', $str, $rgMatches);
$rgResult = array_map('strlen', $rgMatches[0]);// [1,1,4]
}
print_r($rgData); print_r( $rgResult);
var_dump(time());
for ($i=1;$i<100000;$i++){
//nickb
$temp = preg_split('/(\s+)/', $str, -1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$spaces = array();
$words = array_reduce( $temp, function( &$result, $item) use ( &$spaces) {
if( strlen( trim( $item)) === 0) {
$spaces[] = strlen( $item);
} else {
$result[] = $item;
}
return $result;
}, array());
}
print_r( $words); print_r( $spaces);
var_dump(time());
INT(1378392870) 排列 ( [0] =&gt;这个 [1] =&gt;是 [2] =&gt;一个 [3] =&gt;串 ) 排列 ( [0] =&gt; 1 [1] =&gt; 1 [2] =&gt; 4 ) INT(1378392871) 排列 ( [0] =&gt;这个 [1] =&gt;是 [2] =&gt;一个 [3] =&gt;串 ) 排列 ( [0] =&gt; 1 [1] =&gt; 1 [2] =&gt; 4 ) INT(1378392873)
答案 6 :(得分:0)
早期的答案已经很好地证明了使用正则表达式进行拆分,但我认为这是调用 ctype_space()
来确定哪个结果数组应该接收遇到的值的完美案例。
代码:(Demo)
$string = "This is a string";
$words = [];
$spaces = [];
foreach (preg_split('~( +)~', $string, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $s) {
if (ctype_space($s)) {
$spaces[] = strlen($s);
} else {
$words[] = $s;
}
}
var_export([
'words' => $words,
'spaces' => $spaces
]);
输出:
array (
'words' =>
array (
0 => 'This',
1 => 'is',
2 => 'a',
3 => 'string',
),
'spaces' =>
array (
0 => 1,
1 => 1,
2 => 4,
),
)
如果您想替换 preg_split()
使用的管道常量,您可以使用 3
(Demo)。这表示 PREG_SPLIT_NO_EMPTY
是 1
加上 PREG_SPLIT_DELIM_CAPTURE
是 2
。请注意,随着代码宽度的减少,您也会失去代码的可读性。
preg_split('~( +)~', $string, -1, 3)