php explode: split string into words by using space a delimiter

后端 未结 6 2066
粉色の甜心
粉色の甜心 2020-12-08 15:17
$str = \"This is a    string\";
$words = explode(\" \", $str);

Works fine, but spaces still go into array:

$words === array (\'This         


        
相关标签:
6条回答
  • 2020-12-08 15:40

    Another way to do it would be using foreach loop.

    $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);
    }
    }
    
    0 讨论(0)
  • 2020-12-08 15:48

    Here are the results of performance tests:

    $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] => This [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)

    0 讨论(0)
  • 2020-12-08 16:00

    For splitting the String into an array, you should use preg_split:

    $string = 'This is a    string';
    $data   = preg_split('/\s+/', $string);
    

    Your second part (counting spaces):

    $string = 'This is a    string';
    preg_match_all('/\s+/', $string, $matches);
    $result = array_map('strlen', $matches[0]);// [1, 1, 4]
    
    0 讨论(0)
  • 2020-12-08 16:00

    You can use preg_split() for the first array:

    $str   = 'This is a    string';
    $words = preg_split('#\s+#', $str);
    

    And preg_match_all() for the $spaces array:

    preg_match_all('#\s+#', $str, $m);
    $spaces = array_map('strlen', $m[0]);
    
    0 讨论(0)
  • 2020-12-08 16:03

    $financialYear = 2015-2016;

    $test = explode('-',$financialYear);
    echo $test[0]; // 2015
    echo $test[1]; // 2016
    
    0 讨论(0)
  • 2020-12-08 16:04

    Here is one way, splitting the string and running a regex once, then parsing the results to see which segments were captured as the split (and therefore only whitespace), or which ones are words:

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

    You can see from this demo that $words is:

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

    And $spaces is:

    Array
    (
        [0] => 1
        [1] => 1
        [2] => 4
    )
    
    0 讨论(0)
提交回复
热议问题