3

假设我有一个字符串:

$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.').

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

有人知道怎么做吗?

4

10 回答 10

11

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

于 2009-05-08T16:56:40.227 回答
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.
    )

)

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

于 2009-05-08T17:09:12.210 回答
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));
于 2009-05-11T21:50:08.747 回答
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);

于 2009-05-08T17:10:36.777 回答
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功能很糟糕,请告诉我,以便我从错误中吸取教训。

于 2009-05-08T17:48:32.253 回答
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);
于 2009-05-08T17:03:16.123 回答
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);
 }
于 2009-05-11T22:19:24.360 回答
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!
于 2009-05-09T16:37:36.967 回答
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."
}
于 2009-05-08T17:12:21.873 回答
0

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

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

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

代码:(演示

$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.',
)
于 2020-09-05T11:56:21.200 回答