假设我有一个字符串:
$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.').
字符串可能有一些奇数字,所以数组中的最后一项可能不包含两个单词。
任何人都知道怎么做?
答案 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.',
)