爆炸其他每一个字

时间:2009-05-08 16:53:51

标签: php explode

假设我有一个字符串:

$string = "This is my test case for an example."

如果我根据''我得到

进行爆炸
Array('This','is','my','test','case','for','an','example.');

我想要的是每隔一个空间爆炸:

Array('This is','my test','case for','an example.').

字符串可能有一些奇数字,所以数组中的最后一项可能不包含两个单词。

任何人都知道怎么做?

10 个答案:

答案 0 :(得分:11)

我会查看结果,并在事后连接字符串。

答案 1 :(得分:8)

$matches = array();
preg_match_all('/([A-Za-z0-9\.]+(?: [A-Za-z0-9\.]+)?)/',
       'This is my test case for an example.',$matches);

print_r($matches);

的产率:

Array
(
  [0] => Array
    (
        [0] => This is
        [1] => my test
        [2] => case for
        [3] => an example.
    )

  [1] => Array
    (
        [0] => This is
        [1] => my test
        [2] => case for
        [3] => an example.
    )

)

更新修复它以匹配句子末尾的单个词

答案 2 :(得分:3)

可用于不同分隔符和数字的函数。

function explodeEveryNth($delimiter, $string, $n) {
    $arr = explode($delimiter, $string);
    $arr2 = array_chunk($arr, $n);
    $out = array();
    for ($i = 0, $t = count($arr2); $i < $t; $i++) {
        $out[] = implode($delimiter, $arr2[$i]);
    }
    return $out;
}

测试代码

var_dump(explodeEveryNth(' ', 'This is a test string', 2));

答案 3 :(得分:2)

$string = "This is my test case for an example.";

preg_match_all("/[a-zA-Z0-9]+\ [a-zA-Z0-9]+/", $string, $matches);
print_r($matches);

$string = "This is my test case for an example."; preg_match_all("/[a-zA-Z0-9]+\ [a-zA-Z0-9]+/", $string, $matches); print_r($matches);

答案 4 :(得分:1)

$matches = array();
preg_match_all('/\S+(?:\s[A-Za-z0-9.]+|$)/',
    'This is my test case for an example.',
    $matches
);
print_r($matches);
preg_match_all('/\S+(?:\s[A-Za-z0-9.]+|$)/',
    'This is my test case for example.',
    $matches
);
print_r($matches);

答案 5 :(得分:1)

您可以在其他方案中重复使用的内容:(总是更好的IMO)。

虽然可能不是最优雅的解决方案,但它确实遵循其他PHP核心功能的一般概念语法......

无论如何......这使用递归。它的灵活性在于它允许您指定块的大小(如果您希望在未来的路上或不同的项目中执行此操作)。我这样做是为了更多的个人挑战,看看我能想出什么。

<?php
function chunk_explode($glue=' ',$pieces='',$size=2,$final=array()) {
    if(!is_string($pieces) && !is_array($pieces)) 
        return false;

    if(is_string($pieces))
        $pieces = explode($glue,$pieces);

    $num_pieces = sizeof($pieces);
    if($num_pieces <= 0) 
       return $final;

    if($num_pieces >= $size) {
        $arr_chunk = array_chunk($pieces, $size);
        array_push($final,implode($glue,$chunk[0]));
        for($i=0;$i<=$size;$i++) { array_shift($pieces); }
        return chunk_explode($glue,$pieces,$size,$final);
    }
    array_push($final,implode($glue,$pieces));
    return $final;
}
$string = "This is my test case for an example.";
chunk_explode(' ',$string,3);

如果这个chunk_explode功能很糟糕,请告诉我,以便我可以从错误中吸取教训。

答案 6 :(得分:1)

PHP中有75个数组函数,让我们尝试使用它们代替for循环!!

我喜欢Kyle的功能名称。 (我假设你没有运行5.3并且受到create_function的影响。)

 function chunk_explode($string, $chunks = 2, $delim = ' ') {
     $A = explode($delim, $string);
     $A = array_chunk($A, $chunks);
     return array_map(
         create_function('$x',
            'return implode(\'' . $delim . '\',$x);'), $A);
 }

答案 7 :(得分:0)

    $str = "This is my test case for an example.";
    $arr = split(' ', $str);
    $newArr = array();
    $count = count($arr);
    for($i=0;$i<$count;$i = $i + 2) {
        $newArr[] = $arr[$i] . ' ' . $arr[$i+1];
    }


array(4) {
  [0]=>
  string(7) "This is"
  [1]=>
  string(7) "my test"
  [2]=>
  string(8) "case for"
  [3]=>
  string(11) "an example."
}

答案 8 :(得分:0)

很明显,这不是最好的解决方案,但以我自己的方式搞清楚这很有趣。还有很多东西需要学习......

function solveThisPuzzle($string) {

$modified_string = preg_replace('(\s)', '+', $string, -1, $count);  
$words = explode('+', $modified_string);

$phrases_arr = array();

for($i = 1; $i < $count+1; $i++) {
    if(($i % 2)) {
        $phrase = $words[$i-1].' '.$words[$i];
        $phrases_arr[] = $phrase;
        unset($phrases_arr[$i]);
    } elseif($i == $count) {
            $phrase = $words[$i];
            $phrases_arr[] = $phrase;
        } else {            
            $phrase = NULL;
        }
}

foreach($phrases_arr as $final_phrase) {
    $solution .= $final_phrase.'<br />';
}

    return $solution;

}

$string = "This is my test case for an example, huzzah!";
echo solveThisPuzzle($string);

This is
my test
case for
an example,
huzzah!

答案 9 :(得分:0)

我不会在自己的项目中使用任何先前发布的答案。

最干净,最直接的工具是preg_split()。匹配第一个非空格字符序列,然后匹配一个空格,然后匹配下一个非空格字符序列,然后“忘记”匹配的字符并匹配爆炸过程中必须消耗的空格。

\K的意思是“从此处重新开始全字符串匹配”。使用\K消除了实现捕获组以及PREG_标志的需要。

代码:(Demo

$string = "This is my test case for an example.";

var_export(
    preg_split('~[^ ]+ [^ ]+\K ~', $string)
);

输出:

array (
  0 => 'This is',
  1 => 'my test',
  2 => 'case for',
  3 => 'an example.',
)