繁体   English   中英

将条形码扫描字符串转换为变量

[英]Convert barcode scan string to variables

我有一个条形码,在扫描后需要将其分成五个变量。

Example barcode scan: 0109556135082301172207211060221967 21Sk4YGvF8
Alternate scan: 010955704600017017250630102107015

有5个分隔符

01 - gtin (14 DIGIT only)
11 - production date (YYMMDD)
17 -  expire date (YYMMDD)
10 - batch no (can be variable but not more than 20 digit)  
<space>21 - serial no (can be variable but not more than 20 digit)


01
09556135082301 (gtin)
17
220721 (production date)
10
60221967 (batch number)
 21
Sk4YGvF8 (serial number)

这是我的尝试:

$str = "0109556135082301172207211060221967 21Sk4YGvF8"

if ($strtemp != null){
    $ais = explode("_",$str);
    for ($aa=0;$aa<sizeof($ais);$aa++)
    {
        $ary = $ais[$aa];
        while(strlen($ary) > 0) {
            if (substr($ary,0,2)=="01"){
                $igtin = substr($ary,2,14);
                $ary = substr($ary,-(strlen($ary)-16));
            }

            else if (substr($ary,0,2)=="17"){
                $expirydate = substr($ary,6,2)."-".substr($ary,4,2)."-20".substr($ary,2,2);
                $ary = substr($ary,-(strlen($ary)-8));
            }
            else if (substr($ary,0,2)=="10"){
                $batchno = substr($ary,2,strlen($ary)-2);
                $ary = "";
            }
            else if (substr($ary,0,2)=="21"){
                $serialno = substr($ary,2,strlen($ary)-2);
                $ary = "";
            }
            else if (substr($ary,0,2)=="11"){
                $proddate = substr($ary,6,2)."-".substr($ary,4,2)."-20".substr($ary,2,2);
                $ary = substr($ary,-(strlen($ary)-8));
            }

            else {
                $oth = "";
            }
        }

想要的结果:

项目 结果
GTIN 09556135082301
到期日期 21-07-2022
批号 60221967
序列号 Sk4YGvF8

从我上面的变量代码中得出这样的结果:

项目 结果
GTIN 09556135082301
到期日期 21-07-2022
批号 6022196721Sk4YGvF8
序列号
else if (substr($ary,0,2)=="10"){
    $batchno = substr($ary,2,strlen($ary)-2);
    $ary = "";
}

回答你的问题。 原因是当找到“10”时,使用剩余的字符串。 你需要做你在其他分支机构所做的事情。


给你一些建议。 您的方法很难阅读,您最好forswitch到优化代码,如下所示:

for($i = 0; $i < strlen($ary); )
{
    $h = substr($ary, $i, 2);
    $i += 2;
    switch($h)
    {
        case '01':
           $igtin = substr($ary,$i,14);
           $i += 14;
           break;

        case '10':
        .......
    }
}

您的代码有点长而且太笨拙,无法阅读和调试。 相反,我提出了另一种使用正则表达式的方法,因为正则表达式似乎是解决此问题的正确工具。

  • /(?=\(\d+\))/拆分字符串,这是一个基于(some code) some string模式的正向先行断言拆分字符串。

  • 现在,对于每一个,使用另一个正则表达式/^(\(\d+\))(.+)$/将起始代码捕获为键,并将 rest 作为值。 这匹配起始代码后跟任何字符 1 次或多次。

片段:

<?php


$str = '(01)09556135082301(17)220721(10)60221967(21)Sk4YGvF8';

$result = [];

foreach(preg_split('/(?=\(\d+\))/', $str) as $match){
  $matches = [];
  if(preg_match('/^(\(\d+\))(.+)$/', $match, $matches) === 1){
    $result[ $matches[1] ] = $matches[2];
  }
}

print_r($result);

在线演示

注意:您可以稍后拆分键(17)处的值以获得该日期格式。

我想我可能拥有它。

01
09556135082301
17
220721
10
60221967
21
Sk4YGvF8

由于固定值长度,获取 gtin 和 expires 很简单。
假设“21”不会出现在序列号中。 strrpos 在 $str 中找到“21”的最后一个 position。 所以序列号来自 position + 2 ,其中 +2 是“21”的长度,并从 position 中取出 substring 到最后。
使用过期的 position 到 "21" 的 position 得到 $batch。

$len = strlen($str);
$gtin = substr($str,2,14);
$expires = substr(18,6);
$position = strrpos('21', $str) + 2;
$serial = substr($str,$position);
$batch = substr($str,24,$len - $position); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM