我的字符串格式如下:
1PR009427S0000754
首先让我解释一下这种格式。如果您看到" 1P" ,则表示它是产品的部件号的开头。从" S" 开始,代表产品的序列号。使用这种字符串格式,我能够将这一个字符串拆分或爆炸成两个没有任何问题,直到我遇到这种字符串格式。
1P0005-00118-33S3S216
1PS-35C-602S6510873143
1P0005-00115-SPS3S216
如果你们注意到对于这些新格式,他们在一个字符串中得到了几个" S" ,问题是当我爆炸我使用的字符串时 1P 告诉程序它是部件号的开头,只要它看到" S" 就是一个开始产品的序列号。我担心的是,当我爆炸新字符串时,由于字符串中出现了几个S,我得到了错误的部件号和序列号的结果。
这是我的程序样本
if($_POST['submit'])
{
$text = explode("<br />",nl2br($_POST['pn']));
foreach ($text as $key => $value)
{ //start foreach statements
$precage = "0617V";
$presym = "[)>";
$partn = "1P";
$serial = "S";
$match = preg_match('/[)>0617V1PS]/', $value);
if($match == true)
{
$value2 = substr($value[1], 5);
$result = explode("1P", $value2);
$fin_pnresult = explode("S", $result[1]) ;
$serial1 = strrchr($value2, $serial);
$fin_serial = substr($serial1, 1);
$cageresult = substr($value2, 0, strpos($value2, "1P"));
}
}
?>
谢谢你们的帮助。
答案 0 :(得分:1)
如果您对该部分有任何控制权,我建议您更改分隔符。
这是解决当前问题的快速而肮脏的方法。
$string = "1P0005-00118-33S3S2161PS-35C-602S65108731431P0005-00115-SPS3S216";
$products = explode("1P", $string);
foreach ($products as $product) {
if (strlen($product) == 0) continue;
$first_s = strpos($product, "S", 1);
if (substr($product, $first_s, 2) == 'SP') {
$first_s = strpos($product, "S", $first_s+1);
}
$serial = substr($product, $first_s+1, strlen($product));
$product_id = substr($product, 0, $first_s);
echo $product_id."\n".$serial."\n\n";
}
// should give you
/*
0005-00118-33
3S216
S-35C-602
6510873143
0005-00115-SP
3S216
*/
答案 1 :(得分:0)
正如您所观察到的,根据序列号的S
标识符进行正确分割非常困难。您的数据可能如下所示:1PABCRSQ
S1234
您的部分应为1PABCRSQ
,而序列应为1234
。在S
上拆分将无法解决问题。
在另一种情况下,您的数据可能如下所示:1ABCRSSSSS1234
您的部分应为1ABCRSS
,而序列应为SS1234
。程序没有简单的方法可以知道S
的哪个部分确实是部分,哪个是连续部分。
假设第一个S分割部分和序列,以下代码可能对您有所帮助:
<?php
$data = '1ABCRSSSSS1234'; //'1P0005-00115-SPS3S216';
// split by S
$partInfo = explode('S',$data);
// The first element of split array is the part. Remove 1P and show the part number
echo "Data was $data\n";
echo 'Part is ', str_replace('1P', '', $partInfo[0]), "\n";
// Remove the first element and attach the remaining elements using an S
array_shift($partInfo);
$partInfo = implode('S', $partInfo);
echo "Serial is $partInfo\n";
?>
结果:
Data was 1ABCRSSSSS1234
Part is 1ABCR
Serial is SSSS1234
Data was 1P0005-00115-SPS3S216
Part is 0005-00115-
Serial is PS3S216
如果需要拆分部分和序列的更多规则明确定义要考虑的S,那么SO上的某个人可以帮助提供更好的答案。