11

我正在寻找将字符串拆分为数组的方法,排序为str_split(),其中块的大小都不同。

我可以通过用一堆 遍历字符串来做到这一点substr(),但这看起来既不优雅也不高效。是否有一个函数可以接受一个字符串和一个数组,比如 ( 1, 18, 32, 41, 108, 125, 137, 152, 161),并产生一个适当切分的字符串片段数组?

Explode 是不合适的,因为块由不同数量的空格分隔。

4

4 回答 4

10

PHP 中没有任何东西可以为您做到这一点(它有点具体)。所以作为 radashk 就是 siad,你只需要写一个函数

function getParts($string, $positions){
    $parts = array();

    foreach ($positions as $position){
        $parts[] = substr($string, 0, $position);
        $string = substr($string, $position);
    }

    return $parts;
}

类似的东西。然后你可以在任何你喜欢的地方使用它,所以它很干净:

$parts = getParts('some string', array(1, ... 161));

如果你真的想要,你可以将它内爆成一个正则表达式:

^.{1}.{18} <lots more> .{161}$

会匹配你想要的。

于 2012-07-08T09:57:40.160 回答
3

仅供将来参考,@jay 建议的正则表达式方法如下所示:

 $regex="/(.{1})(.{18})(.{32})(.{41})(.{108})(.{125})(.{137})(.{152})(.{161})/";
 preg_match($regex,$myfixedlengthstring,$arr);

其中$myfixedlengthstring是目标字符串,$arr给你结果

于 2015-10-30T19:10:54.473 回答
3

我会使用解包():

$str = "?ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890....";
$array = unpack("a1first/a26second/a10third/a*rest",$str);
print_r($array);

这将返回:

Array
(
    [first] => ?
    [second] => ABCDEFGHIJKLMNOPQRSTUVWXYZ
    [third] => 1234567890
    [rest] => ....
)
于 2018-07-05T15:41:11.173 回答
1

一个更灵活的变体,用于解析具有固定长度记录的 ASCII 表:

function ParseIrregularString  ($string, $lengths)
{ 
$parts = array(); 

foreach ($lengths as $StringKey => $position)
    { 
    $parts[$StringKey] = substr($string, 0, $position); 
    $string = substr($string, $position); 
    } 

return $parts; 
} 

提交以下内容:

$string = "abcdefghiklmnopqrstuvz";
$lengths = array ("field1"=>4, "field2"=>3, "field3"=>5, "field4"=>2);
print_r (ParseIrregularString ($string, $lengths));

返回:

Array ( [field1] => abcd [field2] => efg [field3] => hiklm [field4] => no )
于 2012-07-13T13:05:26.543 回答