PHP Regex 在字符串中插入特定字符串以打印 code128 条形码
Posted
技术标签:
【中文标题】PHP Regex 在字符串中插入特定字符串以打印 code128 条形码【英文标题】:PHP Regex to insert specific strings in a string in order to print a code128 barcode 【发布时间】:2019-10-27 03:39:46 【问题描述】:为了使用 ZPL II 语言的斑马打印机打印 code128 条形码,我正在尝试将字符串(这是我的条形码)转换为新字符串。这个新字符串与一些与在 ALPHA 和 NUMERIC 模式之间切换相关的特定命令相同。切换到 NUMERIC 模式有助于使您的条码更紧凑。
所以假设我要打印的条形码是:C00J025042101110823611001150119611
结果应该是这样的:
>:C00J>5025042101110823611001150119611
>: mean we Start in ALPHA
>5 Mean we switch from ALPHA to NUMERIC ONLY
>6 Mean we switch from NUMERIC to ALPHA
所以我正在寻找的是(如果可能的话)一个将在我的字符串中插入>5
或>6
的正则表达式。
这是另一个例子:
要打印的条形码 = CJYJY10442101110S23611001150119611
要发送到打印机的字符串 = >:CJYJY1>50442101110>6S2>53611001150119611
更多示例,以便了解它是如何开始的。左边是要打印的条形码,右边是发送到打印机的代码。
C000025042101110823611001150119611
>:C0>500025042101110823611001150119611
CJ00025042101110823611001150119611
>:CJ>500025042101110823611001150119611
C0J0025042101110823611001150119611
>:C0J0>5025042101110823611001150119611
C00J025042101110823611001150119611
>:C00J>5025042101110823611001150119611
C000J25042101110823611001150119611
>:C000J2>55042101110823611001150119611
C0000J5042101110823611001150119611
>:C>50000>6J>55042101110823611001150119611
C00000J042101110823611001150119611
>:C0>50000>6J0>542101110823611001150119611
ZEBRA ZPL II 文档的额外说明:
代码 128 子集 A 和 C 被编程为字段数据字符串中的数字对 00-99。 [...] 在子集 C 中,它们按输入的方式打印。 注意:编程为数字对 (D2) 的第一个字符的非整数将被忽略。但是,编程为数字对 (2D) 的第二个字符的非整数会使整个数字对无效,并且该对被忽略。代码移位前的字段数据字符串中额外的未配对数字也将被忽略。
子集 C 是 NUMERIC,由“>6”调用
【问题讨论】:
据我所知,没有标准,您可以选择何时切换到 ALPHA 或 NUMERIC。 ZPL-II 语言并不简单,我想清楚。可以从字符串的开头一直到结尾都停留在 ALPHA 中,但这会使条形码变得非常大。切换到 NUMERIC 模式是大大减小条形码大小的技巧。 你是对的,这是我的标签设计软件(Codesoft)生成的字符串,我不知道为什么它没有那样做......但无论如何它应该可以工作。顺便说一句,这是一张只有 Alpha 中的条形码的图片,并且在相同的条形码下方从 alpha 切换到 NUM,您可以看到宽度差异:i.imgur.com/SvDpZ2D.png 【参考方案1】:您可以将 preg_replace 与数组参数一起使用:
$result = preg_replace(
array(
'/(^\D)/',
'/(\D)(\d)/',
'/(\d)(\D)/',
),
array(
'>:$1',
'$1>5$2',
'$1>6$2',
),
$code
);
UPD
根据最后的 cmets,您可以尝试仅在找到对号的情况下在模式之间切换。
$result = preg_replace(
array(
'/(^\D)/',
'/((?:\d2)+)/',
'/\>[56]$/',
),
array(
'>:$1',
'>5$1>6',
'',
),
$code
);
【讨论】:
这给了我一个错误:解析错误:语法错误,意外'[',期待')' 您运行的是哪个版本的 php? 我在我的服务器上运行 PHP 5.3.13...由于某种原因我暂时无法升级它。 刚刚更新了根据 PHP 版本 array() 替换为[]
好吧,当我将结果代码(100% 正确)发送到打印机时,当我用扫描仪读取条形码时,右边的最后一个数字丢失了......我不知道如果是因为我们这样做 >:C>500J>50250....
而不是 >:C00J>50250....
以上是关于PHP Regex 在字符串中插入特定字符串以打印 code128 条形码的主要内容,如果未能解决你的问题,请参考以下文章