23
$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 つのスペースを意味します。

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

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

4

8 に答える 8

3

これは、文字列を分割して正規表現を 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());

このデモから次のことがわかります$words

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

そして$spaces、次のとおりです。

Array
(
    [0] => 1
    [1] => 1
    [2] => 4
)
于 2013-09-05T14:30:32.023 に答える
0

それを行う別の方法は、 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);
}
}
于 2013-09-05T14:22:01.670 に答える
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] => この [1] => は [2] => [3] => 文字列 ) 配列 ( [0] => 1 [1] => 1 [2] => 4 ) int(1378392871) 配列 ( [0] => この [1] => は [2] => [3] => 文字列 ) 配列 ( [0] => 1 [1] => 1 [2] => 4) int(1378392873)

于 2013-09-05T15:07:25.537 に答える
0

$financialYear = 2015-2016;

$test = explode('-',$financialYear);
echo $test[0]; // 2015
echo $test[1]; // 2016
于 2015-04-15T08:57:14.710 に答える
0

ctype_space()正規表現による分割は以前の回答でよく示されていますが、これは、どの結果配列が遭遇した値を受け取るべきかを決定するために呼び出すのに最適なケースだと思います。

コード: (デモ)

$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,
  ),
)

で使用されているパイプ定数を置き換えたい場合は、( Demopreg_split() )を使用できます。これはどちらがプラスでどちらが であるかを表しています。このコード幅の縮小により、コードの可読性も失われることに注意してください。3PREG_SPLIT_NO_EMPTY1PREG_SPLIT_DELIM_CAPTURE2

preg_split('~( +)~', $string, -1, 3)
于 2021-07-14T07:40:39.807 に答える