[查看我的编辑以获得更好的解释]
我需要一些非常大的字符串帮助。
就像这样:
$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#”末尾的每个分隔符。
现在我继续使用数组,并为其中的每个值。用它做点什么。
我现在会尝试...我会发布一些案例,我设法做到与否。
答案 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
即可将字符串转换为数组。但不确定这是否是你需要的。
答案 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] =>
)