每隔三個分號(;)如何爆炸?php爆炸字符
示例數據: $ string = piece1; piece2; piece3; piece4; piece5; piece6; piece7; piece8;
例子輸出爲:
$output[0] = piece1;piece2:piece3;
$output[1] = piece4;piece5;piece6;
$output[2] = piece7;piece8;
謝謝!
每隔三個分號(;)如何爆炸?php爆炸字符
示例數據: $ string = piece1; piece2; piece3; piece4; piece5; piece6; piece7; piece8;
例子輸出爲:
$output[0] = piece1;piece2:piece3;
$output[1] = piece4;piece5;piece6;
$output[2] = piece7;piece8;
謝謝!
我相信你可以用正則表達式來做一些漂亮的事情,但是爲什麼不分解每一個半色,然後一次添加三個。
$tmp = explode(";", $string);
$i=0;
$j=0;
foreach($tmp as $piece) {
if(! ($i++ %3)) $j++; //increment every 3
$result[$j] .= $piece;
}
我想同樣的事情......雖然必須與正則表達式一個漂亮的方式。 – 2009-08-13 22:40:31
那裏可以。但是,由於我對正則表達式的處理很糟糕,所以我會避免使用它們,並執行類似 – 2009-08-13 22:44:05
之類的棘手問題,「儘管用正則表達式必須有更漂亮的方法。」 hahahahahahahaha – nickf 2009-08-13 23:04:34
也許從不同的角度來看待它。將所有內容分解(),然後再將它合併爲三部分。像這樣...
$str = "1;2;3;4;5;6;7;8;9";
$boobies = explode(";", $array);
while (!empty($boobies))
{
$foo = array();
$foo[] = array_shift($boobies);
$foo[] = array_shift($boobies);
$foo[] = array_shift($boobies);
$bar[] = implode(";", $foo) . ";";
}
print_r($bar);
陣列 ( [0] => 1; 2; 3; [1] => 4; 5; 6; [2] => 7; 8; 9 ; )
$string = "piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8;piece9;";
preg_match_all('/([A-Za-z0-9\.]*;[A-Za-z0-9\.]*;[A-Za-z0-9\.]*;)/',$string,$matches);
print_r($matches);
Array
(
[0] => Array
(
[0] => piece1;piece2;piece3;
[1] => piece4;piece5;piece6;
[2] => piece7;piece8;piece9;
)
[1] => Array
(
[0] => piece1;piece2;piece3;
[1] => piece4;piece5;piece6;
[2] => piece7;piece8;piece9;
)
)
如果塊數不是3的倍數,則失敗。 – mercator 2009-08-13 23:28:16
這裏有一個正則表達式的方法,這我不能說是太漂亮。
$str='';
for ($i=1; $i<20; $i++) {
$str .= "$i;";
}
$split = preg_split('/((?:[^;]*;){3})/', $str, -1,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
輸出:
Array
(
[0] => 1;2;3;
[1] => 4;5;6;
[2] => 7;8;9;
[3] => 10;11;12;
[4] => 13;14;15;
[5] => 16;17;18;
[6] => 19;
)
另一個正則表達式的方法。
<?php
$string = 'piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8';
preg_match_all('/([^;]+;?){1,3}/', $string, $m, PREG_SET_ORDER);
print_r($m);
結果:
Array
(
[0] => Array
(
[0] => piece1;piece2;piece3;
[1] => piece3;
)
[1] => Array
(
[0] => piece4;piece5;piece6;
[1] => piece6;
)
[2] => Array
(
[0] => piece7;piece8
[1] => piece8
)
)
將按如下所述格式化輸出數組:$ m = array_map(create_function('$ a','return $ a [0];'),$ m ); – danamlund 2009-08-14 00:49:19
正則表達式拆分
$test = ";2;3;4;5;6;7;8;9;10;;12;;14;15;16;17;18;19;20";
// match all groups that:
// (?<=^|;) follow the beginning of the string or a ;
// [^;]* have zero or more non ; characters
// ;? maybe a semi-colon (so we catch a single group)
// [^;]*;? again (catch second item)
// [^;]* without the trailing ; (to not capture the final ;)
preg_match_all("/(?<=^|;)[^;]*;?[^;]*;?[^;]*/", $test, $matches);
var_dump($matches[0]);
array(7) {
[0]=>
string(4) ";2;3"
[1]=>
string(5) "4;5;6"
[2]=>
string(5) "7;8;9"
[3]=>
string(6) "10;;12"
[4]=>
string(6) ";14;15"
[5]=>
string(8) "16;17;18"
[6]=>
string(5) "19;20"
}
本質上相同的解決方案與其他那些explode
並再次加入...
$tmp = explode(";", $string);
while ($tmp) {
$output[] = implode(';', array_splice($tmp, 0, 3));
};
最簡單的辦法我可以認爲o f爲:
$chunks = array_chunk(explode(';', $input), 3);
$output = array_map(create_function('$a', 'return implode(";",$a);'), $chunks);
第一行+1,第二行-1)(使用'create_function()'是不好的)。從PHP 5開始。3你可以使用lambda函數,但是:'$ output = array_map(function($ a){return implode(';',$ a);},$ chunks);' – mercator 2009-08-15 16:14:59
是的。我想我們可以在現在發佈的答案中開始使用5.3特性。 – cletus 2009-08-15 22:45:00
適用於開箱即用的代碼+1(即使它已被棄用)。我想要一個快速解決方案,我可以拖放和輕鬆自定義。就是這樣。 – 2015-11-17 17:24:58
+1愛情的問題,以及各種反應:) – karim79 2009-08-13 23:19:03