格式化ID条形码扫描仪中的数据

时间:2017-07-20 21:02:24

标签: php string parsing formatting keyup

我有来自ID扫描仪的数据,如下所示:

@
ANSI 636014040002DL00410276ZC03170033DLDCACDCBNONEDCDNONEDBA02102016DCSBENITEZDACMELISSADADCECILDBD08f02015DBB02101990DBC2DAYBRNDAU064 INDAG2341 LINRTLN AVEDAICHfINODAJCADAK934100000  DAQD8dd1412DCF01/03/201161111/DDFD/16DCGUSADDEUDDFUDDGUDAW150DAZBRNDCK15232D84914120401DDB04162010DDD0
ZCZCAZCBZCCBRNZCDBRNZCEZCF

我需要使用我拥有的密钥从该文本字符串中提取数据

EXA:对于密钥“DCS”,它将是姓氏。所以从字符串中输出“BENITEZ”

我不确定解析此字符串并获取所需的所有值的最佳方法是什么。我遇到的问题是触发的密钥在一个大块中发送文本而不是分别发送每一行。

提前致谢!

以下是一些导致问题的扫描。

@
ANSI 636040080002DL00443261ZU03020011DLDAQ212306482DCSREZADDENDACGILBERTDDFNDADCHRISTIANDDGNDCADDCBADCDNONEDBD04142017DBB08201994DBA08202019DBC1DAU066 inDAYBRODAG123 SUNRISE CTDAIST GEORGEDAJUTDAK847700000  DCF32784241DCGUSADAW135DAZBRODCK216206482UT1TT

@
ANSI 636014040002DL00410280ZC03210033DLDCACDCBNONEDCDNONEDBA06202020DCSJIMENEZDACERIKDADALISBAHANDBD05062016DBB06201991DBC1DAYBLKDAU067 INDAG12345 MARQUETTE LNDAIPOMONADAJCADAK917660000  DAQE1312327DCF05/06/201661227/CCFD/20DCGUSADDEUDDFUDDGUDAW155DAZBR


@ANSI6360450102DL00390234ZW02730027DLDAAKHA,HOANG,TUDAG16130 BORDER AVE
WDAILYNNWOODDAJWADAK98037DAQKHAA**HT392JGDARDASDATDBA20100407DBB19610407DBC1DBD2005
0322DAU507DAW160DAYBRODAL16130 BORDER AVE
WDANLYNNWOODDAOWADAP98037ZWZWA050812E1551ZWBZWC32 

@
ANSI 636009030202DL00410203ZN02440063DLDBA12222020DCSZALDIIVARDCTMICHAEL GEORGEDBD08242016DBB11221985DBC1DAYBRODAU068 inDAG1234 FRINTAGE RD 2116DAILAS VEGASDAJNMDAK877010000  DAQ501231283DCFunavailDCK50960128302DCGUSADCHNONE
ZNZNAZNB5'08"ZNC175ZND9999999

@ - ANSI 636000030001DL00310440DLDCANONE DCB158X9 DCDS
DBA08142017 DCSMAURY DCTJUSTIN,WILLIAM
DBD08142009 DBB07151958 DBC1 DAYBRO DAU075 in DAG123 FIRST STREET
DAISTAUNTON DAJVA DAK244010000 DAQT16123185
DCF061234567 DCGUSA DCHS DDC00000000 DDB12102008 DDD

2 个答案:

答案 0 :(得分:0)

通过使用chris85的建议方法preg_replace

来实现这一点
$scan = "@
ANSI 636014040002DL00410276ZC03170033DLDCACDCBNONEDCDNONEDBA02102016DCSBENITEZDACMELISSADADCECILDBD08f02015DBB02101990DBC2DAYBRNDAU064 INDAG2341 LINRTLN AVEDAICHfINODAJCADAK934100000  DAQD8dd1412DCF01/03/201161111/DDFD/16DCGUSADDEUDDFUDDGUDAW150DAZBRNDCK15232D84914120401DDB04162010DDD0
ZCZCAZCBZCCBRNZCDBRNZCEZCF";

$output = preg_split( "/(DBA|DCS|DAC|DAD|DBD|DBB|DBC|DAY|DAU|DAG|DAI|DAJ|DAK|DAQ|DCF|DCG|DDE|DDF|DDG|DAW|DAZ|DCK|DDB|DDD|ZCZ|ZCB|ZCC|ZCD|ZCE|ZCF)/", $scan);

答案 1 :(得分:0)

虽然您的管道正则表达式可能会产生您想要的结果。我有一个问题和一些新的建议模式。

首先,条形码扫描器在没有不可靠的分隔符集的情况下传送数据。我的意思是,这些值"前缀/标签"不按字母顺序排列,可能导致不匹配。考虑一个名为" DAISY DAWSON HOLIDAY"的驱动程序。这三个名字都有分隔符。即使这些分隔符处于严格的,可预测的顺序中,某些值仍然会影响系统。

无论如何,我会假设数据超出了您的控制范围并尝试从柠檬中制作柠檬水...

您的管道模式非常渴望优化。添加了几个"缺失"分隔符,我使用字符类浓缩了模式,并按照字母顺序从最长到最短排序。我的调整改善了模式:准确性,效率,简洁性和可读性。

这是你的模式:

/(DBA|DCS|DAC|DAD|DBD|DBB|DBC|DAY|DAU|DAG|DAI|DAJ|DAK|DAQ|DCF|DCG|DDE|DDF|DDG|DAW|DAZ|DCK|DDB|DDD|ZCZ|ZCB|ZCC|ZCD|ZCE|ZCF)/

在高达7913步之后进行了31场比赛。

这是我的模式:

/DA[CDGIJKQUWYZ]|DB[ABCD]|DC[BDFGKS]|DD[BDEFG]|ZC[BCDEFZ]|DL|ZC/

它有36场比赛, 1759步

如果分隔符按特定顺序排列,则可以像这样编写一个非常文字的模式:

/@\s*ANSI\s*(\S*?)DL(\S*?)ZC(\S*?)DL(\S*?)DCB(\S*?)DCD(\S*?)DBA(\S*?)DCS(\S*?)DAC(\S*?)DAD(\S*?)DBD(\S*?)DBB(\S*?)DBC(\S*?)DAY(\S*?)DAU(.*?)DAG(.*?)DAI(\S*?)DAJ(\S*?)DAK(.*?)DAQ(\S*?)DCF(\S*?)DDF(\S*?)DCG(\S*?)DDE(\S*?)DDF(\S*?)DDG(\S*?)DAW(\S*?)DAZ(\S*?)DCK(\S*?)DDB(\S*?)DDD(.*?)ZCZ(\S*?)ZCB(\S*?)ZCC(\S*?)ZCD(\S*?)ZCE(\S*?)ZCF(\s*?)/

它不短或漂亮,但它确实匹配 635步中的36个子串。 Demo