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 条形码的主要内容,如果未能解决你的问题,请参考以下文章

如何转义字符串以在 Boost Regex 中使用

Java Regex替换与特定文本匹配的行[重复]

使用 RegEx 在字符串中查找特定文本后的数字

搜索 2 个特定字母后跟 4 个数字 Regex

如何使用 regex.match 在 c# 中提取字符串的特定部分? [复制]

正则表达式:匹配除特定模式之外的所有内容