我正在努力阅读GS1-128条形码,并试图将其拆分为包含的部分,这样我就可以自动填写表格了。
但我想不通。扫描我的条形码会得到以下信息:]d2010704626096200210KT0BT2204[GS]17260900021RNM5F8TMBHZSY7
所以我试着从preg_match开始,并做了以下操作:
/]d2[01]{2}d{14}[10|17|21]{2}(w+)/
这给了我这样的结果:
Array ( [0] => ]d2010704626096200210KT0BT2204 [1] => KT0BT2204 )
现在[1]实际上是正确的,男人[0]不是,所以我撞到了墙上。
最后,这是我想要的结果(没有01,10,17,21(:
(01) 07046260962002
(10) KT0BT2204
(17) 60900
(21) RNM5F8CTMMBHZSY7
01 - Always 14 chars after
17 - Always 6 chars after
10 can be up to 20 chars, but always has end delimiter <GS> - But if barcode ends with 10 <GS> is not present
21 can be up to 20 chars, but always has end delimiter <GS> - But if barcode ends with 21 <GS> is not present
我试着回答这个问题:GS1-128和RegEx但我想不通。
有谁能帮我吗?
这个正则表达式应该可以执行您想要的操作(请注意,为了清晰起见,我将其拆分为单独的行,您可以像这样将其与x
(扩展(标志一起使用,也可以将其转换回一行(:
^]d2(?:
01(?P<g01>.{14})|
10(?P<g10>(?:(?![GS]).){1,20})(?:[GS]|$)|
17(?P<g17>.{6})|
21(?P<g21>(?:(?![GS]).){1,20})(?:[GS]|$)
)+$
它在寻找
- 行
^
的开头,后面跟着文字]d2
,然后是 01
后面跟着14个字符(在g01
组中捕获(10
后面最多20个字符,以[GS]
或行尾结尾(在组g10
中捕获(17
后面跟着6个字符(在g17
组中捕获(21
后面最多20个字符,以[GS]
或行尾结尾(在组g21
中捕获(- 以线路末端
$
完成
请注意,我们需要使用回火贪婪令牌来避免10
或21
代码可能吞下以下代码的情况(如下面regex演示中的第二个示例(。
regex101 演示
在PHP中:
$barcode = ']d201070462608682672140097289158930[GS]10101656[GS]17261130';
preg_match_all('/^]d2(?:
01(?P<g01>.{14})|
10(?P<g10>(?:(?![GS]).){1,20})(?:[GS]|$)|
17(?P<g17>.{6})|
21(?P<g21>(?:(?![GS]).){1,20})(?:[GS]|$)
)+$/x', $barcode, $matches);
print_r($matches);
输出:
Array
(
[0] => Array
(
[0] => ]d201070462608682672140097289158930[GS]10101656[GS]17261130
)
[g01] => Array
(
[0] => 07046260868267
)
[1] => Array
(
[0] => 07046260868267
)
[g10] => Array
(
[0] => 101656
)
[2] => Array
(
[0] => 101656
)
[g17] => Array
(
[0] => 261130
)
[3] => Array
(
[0] => 261130
)
[g21] => Array
(
[0] => 40097289158930
)
[4] => Array
(
[0] => 40097289158930
)
)
3v4l.org 上的演示
]d2[01]{2}(d{14})(?:10|17|21)(w+)[GS](w+)(?:10|17|21)(w+)
你可以试试这样的东西。
请参阅演示。。
https://regex101.com/r/Bw238X/1