web-dev-qa-db-ja.com

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)は、最初のワードの後に​​1スペース、2番目のワードの後に​​1スペース、3番目のワードの後に​​4スペースを意味します。

速くする方法はありますか?

ありがとうございました。

19
Haradzieniec

文字列を配列に分割するには、 preg_split を使用する必要があります。

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

2番目の部分(スペースのカウント):

$string = 'This is a    string';
preg_match_all('/\s+/', $string, $matches);
$result = array_map('strlen', $matches[0]);// [1, 1, 4]
29
Alma Do

$financialYear = 2015-2016;

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

文字列を分割して正規表現を1回実行し、結果を解析して分割としてキャプチャされたセグメント(したがって空白のみ)、またはセグメントが単語であるかどうかを確認する1つの方法を次に示します。

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

このデモから that $wordsは:

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

そして、$spacesは:

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

最初の配列にpreg_split()を使用できます:

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

_$spaces_配列の場合はpreg_match_all()

_preg_match_all('#\s+#', $str, $m);
$spaces = array_map('strlen', $m[0]);
_
1
silkfire

別の方法は、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);
}
}
1
Ahmar Ali

パフォーマンステストの結果は次のとおりです。

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