2009-10-03 46 views
0

[检查我为更好的解释编辑]转换大的字符串返回数组 - 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#"; 

它,因为没有断裂线,但它作为空格。

如果我们好好看看这个,它们是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:黑色墨盒回收 #

TinteiroQUANTIDADE:23#

FIMPROD#


TinteiroID:4#

TinteiroLABEL:HP 51633 M#

TinteiroREF:51633 M#

TinteiroMARCA: HP#

TinteiroGENERO:黑色墨盒回收 #

TinteiroQUANTIDADE:12#

FIMPROD#

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

随着预浸料分割我想每个splited串看起来很像这些那些分配,但具有不同的值:

TinteiroID:[only numbers]# 

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

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

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

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

TinteiroQUANTIDADE:[only numbers]# 

FIMPROD# 

每个splited串然后添加到一个数组:

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# 
) 

然后会有一个for each循环去到阵列中的每个对象。 [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”分隔符为每一个的端部。

现在我走在阵列上,并为它的每个值。用它做什么。

我会尝试现在...我会发布一些事情,我设法做到或不做。

+0

这对我来说很好。看,最简单的方法往往是最好的。 – pavium 2009-10-03 15:00:51

回答

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将包含六根弦,你仍旧需要第一和最后一个元素转换为整数。

+0

因为这个时候有2个,类似的字符串,但在其他情况下,它可能4,5,...等等。 – 2009-10-03 14:30:30

+0

那么,什么?你不能算出解析的项目数吗? – SilentGhost 2009-10-03 14:34:48

+0

你可以帮忙吗..我从来没有这样的代码。 – 2009-10-03 14:40:46

1

这应该怎么做呢:

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

我做我得到3个结果从使preg_split,而应该有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] => 
) 
+0

使用preg_match_all而不是preg_split。 – 2009-10-03 14:17:07

1

使用使preg_split()的困难是,你似乎需要串,两种不同的表现进行分割:\d+[^#]+

我想你应该考虑分割成较小的字符串件,然后再放回一些。

试图用一个preg_split()进行分割会导致更大的复杂性。

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

编辑:是的,沉默的鬼或多或少的说,你不是分裂经常表达[^#]+,你真正需要分割,或在#字符更好爆炸。

然后,您可以将数组重新组合为两个或更多个较小的字符串,也许可以通过检查每个字符串的第一个元素“TinteiroID”。

+0

我会发布一个更好的格式化..只需一秒。 – 2009-10-03 14:07:48

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会帮助你。

+0

的确很不错。有了这个,它将是2个被接受的答案。 – 2009-10-05 11:35:10