0

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

我需要一些帮助来处理我拥有的一个非常大的字符串。

就像这样:

$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在 [ ] 方括号内删除了 and ,我引用了它可以存在的字符。

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

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

任何人都可以提供一些线索如何做到这一点?

谢谢

编辑:

我试图解释我的逻辑。

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

丁泰罗ID:1#

Tinteiro标签:HP CB335EE#

TinteiroREF:CB335EE#

TinteiroMARCA:HP#

TinteiroGENERO:Tinteiro Preto Reciclado#

TinteiroQUANTIDADE:23#

FIMPROD#


丁泰罗ID:4#

Tinteiro标签: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#
)

然后会有一个 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#”末尾的每个分隔符。

现在我已经进入了数组,并为其中的每个值。用它做点什么。

我现在会尝试...我会发布一些我设法做到或没有做到的案例。

4

5 回答 5

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即可将字符串转换为数组。但不确定它是否是您需要的。

在线 PHP正则表达式测试器将为您提供帮助。

于 2009-10-05T06:21:25.900 回答
1

这应该这样做:

"~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i"
于 2009-10-03T13:50:48.047 回答
1

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

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

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

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

编辑:是的,正如 Silent Ghost 或多或少所说的那样,你不是用 正则表达式[^#]+分割,你实际上需要分割,或者最好还是在 # 字符处爆炸。

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

于 2009-10-03T14:05:58.157 回答
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将包含六个字符串,您仍然需要将第一个和最后一个元素转换为整数。

于 2009-10-03T14:14:55.173 回答
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] => 
)
于 2009-10-03T14:01:24.380 回答