解決打印機超出字節之使用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.pswp.cn/news/209789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209789.shtml
英文地址,請注明出處:http://en.pswp.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;往往由于各種因素…