将大字符串转换回数组 - PHP

时间:2009-10-03 13:47:25

标签: php regex preg-split

[查看我的编辑以获得更好的解释]

我需要一些非常大的字符串帮助。

就像这样:

$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";

它没有断行,但它是白色空格。

如果我们好好看看,它们是2个字符串:

$splited_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#";

我想我需要preg_split$big_string中搜索:

TinteiroID:[only numbers]#TinteiroLABEL:[any character, except "#"]#TinteiroREF:[any character, except "#"]#TinteiroMARCA:[any character, except "#"]#TinteiroGENERO:[any character, except "#"]#TinteiroQUANTIDADE:[only numbers]#FIMPROD#

我已经对$splited_string进行了条纹化,并在[]方括号内引用了它可以存在的字符。

对于应该接受的每种类型的字符,它应该是RegExpression标记,而不是[]方括号。但我对此知之甚少。

然后将每个$splited_string存储在数组$array中。

有人可以提供一些线索如何实现这一目标吗?

由于

修改

我试着解释我的逻辑。

我有这个大字符串(没有断行):

  

TinteiroID:1#

     

TinteiroLABEL:HP CB335EE#

     

TinteiroREF:CB335EE#

     

TinteiroMARCA:HP#

     

TinteiroGENERO:Tinteiro Preto   Reciclado#

     

TinteiroQUANTIDADE:23#

     

FIMPROD#

     
     

TinteiroID:4#

     

TinteiroLABEL:HP 51633 M#

     

TinteiroREF:51633 M#

     

TinteiroMARCA:HP#

     

TinteiroGENERO:Tinteiro Preto   Reciclado#

     

TinteiroQUANTIDADE:12#

     

FIMPROD#

它们可以分成2个较小的字符串。

使用preg-split我想分配每个分裂的字符串看起来与这些字符串相似,但具有不同的值:

TinteiroID:[only numbers]#

TinteiroLABEL:[any character, except "#"]#

TinteiroREF:[any character, except "#"]#

TinteiroMARCA:[any character, except "#"]#

TinteiroGENERO:[any character, except "#"]#

TinteiroQUANTIDADE:[only numbers]#

FIMPROD#

然后将每个拆分的字符串添加到数组中:

Array
(
    [0] => TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#
    [1] => TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#
)

然后每个循环都会进入数组中的每个对象。 [0] [1] ...

执行另一个RegExpression以收集值并对这些值执行某些操作。

是的,它的“凌乱”并占用了大量CPU但是......我没有更好的意识形态:S


修改

遵循建议:

我做过这段代码:

$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#";
$array = explode("FIMPROD#", $big_string);

print_r ($array);

它将big_string拆分为每个“FIMPROD#”末尾的每个分隔符。

现在我继续使用数组,并为其中的每个值。用它做点什么。

我现在会尝试...我会发布一些案例,我设法做到与否。

5 个答案:

答案 0 :(得分:1)

这应该这样做:

"~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i"

答案 1 :(得分:1)

使用preg_split()的难点在于您似乎要求将字符串拆分为两个不同的表达式:\d+[^#]+

我认为您应该考虑将字符串拆分为较小的件,然后再将它们重新组合在一起。

尝试使用一个preg_split()进行拆分会导致更大的并发症。

在你的问题中看到完整的字符串也很困难,因为它们必须左右滚动。

编辑:是的,正如Silent Ghost或多或少说的那样,你没有用[^#]+拆分正则表达式,你实际上需要拆分,或者更好的是仍然在#字符爆炸。< / b>

然后你可以将数组重新组合成两个或多个较小的字符串,可能是通过检查'TinteiroID'作为每个字符串的第一个元素。

答案 2 :(得分:1)

为什么你需要正则表达式?你为什么不把它拆分两次?

$num = 6;            # number of elements to in each splited_string
$out = array();
foreach ($explode('#', $big_string) as $str) {
    $tmp = explode(':', $str, 2);
    if (count($tmp) == 2) {
        $out[] = $tmp[1];
    }
}
$subs = intval(count($out) / $num);  # how many splited_strings in the big string
for ($i=0; $i<$sub; $i+$num) {
    $each_id = array_slice($out, $i, $i+$num);  # contains six strings
}

在每次迭代时,$each_id将包含六个字符串,您仍然需要将第一个和最后一个元素转换为整数。

答案 3 :(得分:1)

尝试以下代码。

 <?php
    $str = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";
    preg_match_all("/([A-Za-z]+)\:([^#]+)/", $str, $matches);
    print_r($matches);
    ?>

您只需要一个带/([A-Za-z]+)\:([^#]+)/函数的正则表达式preg_match_all即可将字符串转换为数组。但不确定这是否是你需要的。

online PHP regular expression tester会帮助您。

答案 4 :(得分:0)

我从preg_split获得3个结果,而应该有2个?

没有价值观?

<?php
$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";
$array = preg_split("~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i", $big_string);
print_r ($array);
?>

输出:

Array
(
    [0] => 
    [1] => 
    [2] => 
)