0

我有这样的字符串格式:

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"));


        }
    }

?>

谢谢你们的帮助。

4

2 回答 2

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

*/
于 2013-08-30T04:02:18.403 回答
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 上的某个人可以提供更好的答案。

于 2013-08-30T04:10:31.130 回答