【问题标题】:Exploding and Trimming Strings In PHP在 PHP 中分解和修剪字符串
【发布时间】:2013-08-30 03:44:24
【问题描述】:

我有这样的字符串格式:

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


        }
    }

?>

谢谢你们的帮助。

【问题讨论】:

    标签: php string explode trim


    【解决方案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
    
    */
    

    【讨论】:

    • 0005-00115-SP 的部件号和序列号是 3S216,这意味着 SP 包含在部件号中,序列号在 SP 之后开始 :) 怎么样?
    • 拥有一个也可以作为值的一部分的分隔符并不是一个很好的方法。如果您完全可以控制如何将值传递给您,那么我建议您更改分隔符。
    • 我没有对数据的控制,因为它被扫描仪捕获到矩阵代码中,我们还有什么解决方案吗?但是对于其余的零件号,代码只是最后得到-SP的零件号。 :) 谢谢你
    • 真的非常感谢老板。非常感谢您的帮助。
    【解决方案2】:

    正如您所观察到的,根据序列号的S 标识符正确拆分非常困难。您的数据可能如下所示:1PABCRSQS1234 其中您的部分应该是 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 上的某个人可以提供更好的答案。

    【讨论】:

    • 那么,如果我在零件号上有第一个 S 怎么办?就像这个 1PS-35C-602S6510873143,其中部件号是 1PS-35C-602,序列号是:S6510873143
    • 如果第一个S属于零件号,上述策略将不起作用。因此,必须在仅基于S 进行拆分之前澄清规则。如果您有机会更改格式,我建议您使用~| 分隔部件和序列号
    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多