解决打印机超出字节之使用PHP拆分字符串并保留分隔符

在开发过程中,我们经常需要将一个长字符串拆分成多个片段,并且保留原始字符串中的分隔符。在本篇教程中,我们将使用PHP编写一个函数来实现这个功能。

首先,让我们来看一下我们要解决的问题。假设我们有一个长字符串,我们希望将它拆分成多个片段,每个片段的长度不超过指定的最大长度,并且保留原始字符串中的分隔符。例如,我们有以下字符串:

$str = "===============订单编号:888888888888888888<BR>---------------<BR>商品标题:优质棉质T恤<BR>商品分类:服装<BR>商品规格:男士短袖,白色,L码<BR>商品金额:¥59.99<BR>下单数量:3<BR>合计金额:¥179.97<BR>---------------<BR>商品标题:经典牛仔裤<BR>商品分类:服装<BR>商品规格:女士直筒裤,蓝色,M码<BR>商品金额:¥79.99<BR>下单数量:2<BR>合计金额:¥159.98<BR>---------------<BR>商品标题:多功能运动手表<BR>商品分类:配饰<BR>商品规格:黑色表带,防水,计步功能<BR>商品金额:¥129.99<BR>下单数量:1<BR>合计金额:¥129.99<BR>---------------<BR>商品标题:便携式蓝牙音箱<BR>商品分类:电子产品<BR>商品规格:防水,20W输出,黑色<BR>商品金额:¥89.99<BR>下单数量:5<BR>合计金额:¥449.95<BR>---------------<BR>商品标题:保温不锈钢水壶<BR>商品分类:家居用品<BR>商品规格:500ml,双层不锈钢<BR>商品金额:¥39.99<BR>下单数量:10<BR>合计金额:¥399.90<BR>---------------<BR>商品标题:经典方形太阳镜<BR>商品分类:配饰<BR>商品规格:黑色镜框,防UV镜片<BR>商品金额:¥49.99<BR>下单数量:4<BR>合计金额:¥199.96<BR>---------------<BR>商品标题:全自动咖啡机<BR>商品分类:家电<BR>商品规格:15杯容量,黑色<BR>商品金额:¥299.99<BR>下单数量:1<BR>合计金额:¥299.99<BR>---------------<BR>商品标题:健康按摩椅垫<BR>商品分类:家居用品<BR>商品规格:可调节按摩强度,舒适材质<BR>商品金额:¥169.99<BR>下单数量:2<BR>合计金额:¥339.98<BR>---------------<BR>商品标题:多功能迷你手电筒<BR>商品分类:户外用品<BR>商品规格:可充电,小巧便携<BR>商品金额:¥19.99<BR>下单数量:8<BR>合计金额:¥159.92<BR>---------------<BR>商品标题:时尚帆布背包<BR>商品分类:箱包<BR>商品规格:双肩背包,灰色,大容量<BR>商品金额:¥69.99<BR>下单数量:3<BR>合计金额:¥209.97<BR>---------------<BR>下单合计金额:¥2529.60<BR>下单用户姓名:开发狗<BR>下单用户昵称:DogDev<BR>订单下单时间:2023-12-9 16:00:00";

我们希望将它拆分成多个片段,每个片段的长度不超过10个字符,并且以原始字符串中的<BR>作为分隔符。我们可以使用以下代码来实现这个功能:

public function splitStringArray($str, $maxLength, $delimiter)
{// 初始化结果数组$result = [];// 使用正则表达式拆分字符串为片段,保留分隔符$segments = preg_split('/(' . preg_quote($delimiter, '/') . ')/u', $str, -1, PREG_SPLIT_DELIM_CAPTURE);// 初始化当前片段字符串$currentSegment = '';// 遍历每个片段foreach ($segments as $segment) {// 计算当前片段的长度$currentLength = strlen($currentSegment . $segment);// 检查是否应该将当前片段添加到结果数组中if ($segment === $delimiter || $currentLength <= $maxLength || $currentSegment === '') {// 如果长度未超过最大长度,将当前片段追加到当前片段字符串中$currentSegment .= $segment;} else {// 如果长度超过最大长度,将当前片段字符串添加到结果数组$result[] = $currentSegment;// 重置当前片段字符串为当前片段$currentSegment = $segment;}}if ($currentSegment !== '') {// 将最后一个片段添加到结果数组(如果存在未添加的片段)$result[] = $currentSegment;}// 返回结果数组return $result;
}

先解释一下这段代码的工作原理。

首先,我们定义了一个名为splitStringArray的函数,它接受三个参数:$str表示要拆分的字符串,$maxLength表示每个片段的最大长度,$delimiter表示要保留的分隔符。

在函数内部,我们首先初始化了一个空数组$result,用于存储拆分后的片段。然后,我们使用preg_split函数将字符串拆分成多个片段,并保留分隔符。这里我们使用了正则表达式来匹配分隔符,并使用preg_quote函数对分隔符进行转义,以防止正则表达式中的特殊字符引起错误。

接下来,我们使用一个循环遍历每个片段。在循环中,我们首先计算当前片段的长度,并检查是否应该将当前片段添加到结果数组中。如果当前片段是分隔符,或者当前片段的长度未超过最大长度,或者当前片段字符串为空,我们将当前片段追加到当前片段字符串中。否则,我们将当前片段字符串添加到结果数组中,并将当前片段字符串重置为当前片段。

最后,我们检查是否存在未添加到结果数组中的最后一个片段,并将其添加到结果数组中。

最后,我们返回结果数组。

现在,我们可以使用以下代码来测试我们的函数:

$res = $this->splitStringArray($str, 1000, '<BR>');

打印结果请自己在代码中运行,实在有点长。
正如我们所期望的,原始字符串被成功拆分成了多个片段,并且保留了原始字符串中的分隔符。

总结:

在本篇教程中,我们学习了如何使用PHP编写一个函数来拆分字符串并保留分隔符。我们使用了正则表达式来匹配分隔符,并使用preg_split函数将字符串拆分成多个片段。然后,我们使用循环遍历每个片段,并根据指定的最大长度和当前片段的长度来决定是否将当前片段添加到结果数组中。最后,我们返回结果数组。

希望本篇教程对你有所帮助,如果你有任何问题或建议,请随时留言。谢谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pywinrm 解析输出为 dict 格式 字典格式

s winrm.Session(host, auth(username, password))task_folder \RPA\\ # 运行 schtasks 命令来列出任务计划程序 command schtasks /query /fo csv # command fschtasks /query /fo csv /tn {task_folder} # command fschtasks /query /fo csv /tn "{task_folder}\\…

mapbox使用v3版本,v2的样式切换不同时间段

创建DayAndNight.js /*** 使用方式* const dayNight new DayAndNight({ map: map // map 地图对象}) * 修改类型* dayNight.setConfigProperty(value)*/ class DayAndNight {constructor (sdMap) {this.map sdMap.mapthis.initStyle()}// 初始化时添加必要样式initStyle () {…

删除计算机用户时拒绝访问权限,c盘为什么拒绝访问 删除c盘文件需要管理员权限怎么办...

转载&#xff1a;​​​​​​删除计算机用户时拒绝访问权限,c盘为什么拒绝访问 删除c盘文件需要管理员权限怎么办...-CSDN博客 c盘是电脑中的关键位置&#xff0c;存储着很多系统重要文件&#xff0c;如果电脑出问题一般就是c盘中的文件异常&#xff0c;近日有小伙伴出现这样…

前端知识笔记(四十一)———nodejs发起http或https请求

http请求 const express require(express) const http require(http)const app express()const loginConfig (token) > {return {hostname: api.test.com,port: 80,path: /test?access_token${token},method: GET} }app.get(/login, (req, res) > {const options …

c++通过serial库进行上下位机通信

​编辑 风紊 现役大学牲&#xff0c;半退休robomaster视觉队员 写在前面 本文章主要介绍的是如何通过开源的serial库和虚拟串口实现上位机和下位机通信。 需求 假设下位机有这样一个数据报发送给上位机 struct DataRecv {char start s;TeamColor color TeamColor::Blu…

Premiere Pro 2024 新功能有哪些?视频剪辑软件PR2024更新内容及问题修复

PR软件“基于文本的编辑”中的填充词检测与批量删除功能 “基于文本的编辑”可让您检测“呃”和“嗯”填充词并批量删除它们&#xff0c;从而使您的转录文本更加准确。就像处理停顿一样&#xff0c;您可以单击填充词并将其从序列转录文本中删除。填充词与语言无关&#xff0c;…

STM32CubeIDE(CUBE-MX hal库)----RTC时钟,时钟实时显示

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 STM32CubeIDE(CUBE-MX hal库)----定时器 STM32CubeIDE(CUBE-MX hal库)----蓝牙模块HC-05&#xff08;详细配置&#xff09; 前言…

【无标题】安装环境

这里写目录标题 清华镜像加速 安装cuda11.3 PyTorch 1.10.1https://pytorch.org/get-started/previous-versions/[如果没有可以点Previous pyTorch Versions&#xff0c;这里面有更多的更早的版本](https://pytorch.org/get-started/locally/) 复制非空文件夹cp: -r not specif…

传染病传播速度

题干 R0值是基本传染数的简称&#xff0c;指的是在没有采取任何干预措施的情况下&#xff0c;平均每位感染者在传染期内使易感者个体致病的数量。数字越大说明传播能力越强&#xff0c;控制难度越大。一个人传染的人的数量可以用幂运算来计算。假设奥密克戎的R0为10&#xff0…

《LeetCode力扣练习》代码随想录——字符串(翻转字符串里的单词---Java)

《LeetCode力扣练习》代码随想录——字符串&#xff08;翻转字符串里的单词—Java&#xff09; 刷题思路来源于 代码随想录 151. 反转字符串中的单词 双指针 class Solution {public String reverseWords(String s) {char[] results.toCharArray();resultremoveSpace(result);r…

2023-12-05 Qt学习总结2

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言五 Hello Qt!六 Qt控件和事件七 Qt信号和槽八 Qt自定义信号和槽总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 五 Hello Qt! 现在我们已经有了一个空窗口工程, 传统上, 我们要实现一个"Hello …

(三潮来袭)探寻2023年科技变革潮流与2024年前瞻展望

2023年对于IT行业来说是一个动荡而又充满变革的一年。随着世界逐渐走出前几年的挑战&#xff0c;企业逐渐复苏&#xff0c;但这个行业仍然在经历着激烈的变革。在这个时候&#xff0c;我们看到了一些引人注目的技术变化和未来的趋势。 一、2023年回顾 关键词&#xff1a;Chat…

构建Servlet项目流程

第一步&#xff1a;创建maven项目 部分基础 依赖的模板基础部分如下 maven-archetype-quickstart: 这是最基本的Archetype&#xff0c;它创建一个包含简单Java类和单元测试的项目。 maven-archetype-webapp: 这个Archetype创建一个简单的Java web应用&#xff0c;包括一个serv…

【C++】算法库(批量操作、搜索操作)

C算法库 文章目录 C算法库批量操作for_eachfor_each_n 搜索操作all_of ,any_of ,none_offind, find_if, find_if_notfind_endstd::find_first_ofadjacent_findcount, count_ifequalsearchsearch_n 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;…

微信小程序 - PC端选择ZIP文件

微信小程序 - PC端选择文件 分享代码片段场景分析解决思路附魔脚本chooseMediaZip 选择附魔后的ZIP文件相关方法测试方法 参考资料 分享代码片段 不想听废话的&#xff0c;直接看代码。 https://developers.weixin.qq.com/s/UL9aojmn7iNU 场景分析 如果你的微信小程序需要选…

TypeScript入门实战笔记 -- 开篇 为什么要选择 TypeScript ?

typescript 在线编辑器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

openEuler学习05-kernel升级

周末没事&#xff0c;尝试下openEuler的kernel升级 [rootlocalhost ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)" ANSI_…

营收增速持续放缓,博通CEO期待AI崛起救场 | 百能云芯

博通作为苹果等大型科技公司的芯片供应商&#xff0c;于周四发布了财报。尽管截至10月29日的第四季度营收增长了4%至93亿美元&#xff0c;符合市场预期&#xff0c;但增速已经降至2020年以来的最低水平。 由于企业客户和电信供应商在控制支出方面的谨慎态度&#xff0c;博通的销…

IDEA构建springBoot新项目时JDK只有17和21,无法选择JDK8解决方案

今天创建springboot新项目时&#xff0c;发现IDEA里JDK选项只有17和21&#xff0c;无法选择本机的JDK8&#xff0c;网上查资料后发现是springboot2.7于11.24号后停止维护&#xff0c;基于2.7和java8的spring Initializ官方不再维护&#xff0c;解决方案是在server URL栏&#x…

东北大学Python

目前金属矿开采&#xff0c;爆破还是主要的破岩方式&#xff0c;为了保证巷道采场的安全&#xff0c;需要对爆破震动进行监测&#xff0c;获取的监测数据如附件&#xff0c;第1列数据为震动的序号&#xff0c;第2、3、4列为x,y,z三个方向的震动速度&#xff0c;往往由于各种因素…