0

私はこのような文字列の形式を持っています:

1PR009427S0000754

まず、このフォーマットについて説明します。製品の部品番号の先頭を意味する「1P」が表示されている場合。製品のシリアルナンバーを表す「S」から始まります。この形式の文字列を使用すると、この種の文字列形式に遭遇するまでは、問題なく 1 つの文字列を 2 つに分割または分解できます。

1P0005-00118-33S3S216

1PS-35C-602S6510873143

1P0005-00115-SPS3S216

これらの新しいフォーマットでは、1 つの文字列に 2 つの「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ます。分割してもうまくいきません。1PABCRSQ1234S

別のケースでは、あなたのデータは次のようになるかもしれ1ABCRSSSSS1234ませ1ABCRSSSS1234。プログラムにとって、どの分割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 に答える