php explode: разделите строку на слова, используя пробел разделитель

$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 пробела после третьего слова.

Есть ли способ сделать это быстро?

Спасибо.

Чтобы разделить 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] 

$financialYear = 2015-2016;

 $test = explode('-',$financialYear); echo $test[0]; // 2015 echo $test[1]; // 2016 

Вот один из способов: разбить строку и запустить регулярное выражение один раз, затем проанализировать результаты, чтобы увидеть, какие сегменты были захвачены как разделение (и, следовательно, только пробелы), или какие-то слова:

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

 Array ( [0] => This [1] => is [2] => a [3] => string ) 

И $spaces :

 Array ( [0] => 1 [1] => 1 [2] => 4 ) 

Другой способ сделать это – использовать цикл 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); } } 

Вы можете использовать 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]); 

Вот результаты тестов производительности:

 $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) Array ([0] => Это [1] => is [2] => a [3] => string) Array ([0] => 1 [1] => 1 [2] => 4) int (1378392871) Array ([0] => This [1] => is [2] => a [3] => string) Array ([0] => 1 [1] => 1 [2] => 4) int (1378392873)