在PHP中爆炸和修剪字符串

时间:2013-08-30 03:44:25

标签: php string explode trim

我的字符串格式如下:

  

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


        }
    }

?>

谢谢你们的帮助。

2 个答案:

答案 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上的某个人可以帮助提供更好的答案。