0

0

如何用PHP将字符串按特定模式转为数组?正则表达式技巧

絕刀狂花

絕刀狂花

发布时间:2025-08-28 13:29:01

|

692人浏览过

|

来源于php中文网

原创

preg_split()通过正则表达式实现复杂字符串分割,支持多分隔符、捕获分隔符及去除空元素,适用于不规则分隔场景,而explode()仅支持固定字符串分隔且性能更高,适合简单分割需求。

如何用php将字符串按特定模式转为数组?正则表达式技巧

PHP里,要把字符串按照特定模式拆分成数组,

preg_split()
函数就是那个你需要的瑞士军刀。它远比简单的字符分割要强大,能让你用正则表达式来定义任何你想象得到的复杂分隔符。

解决方案: 说实话,当我们遇到需要按复杂规则拆分字符串时,比如不规则的空白、多个不同的分隔符,或者需要跳过某些特定内容时,

explode()
就显得力不从心了。这时,
preg_split()
就成了我们的不二之选。它的核心思想是,你告诉我一个正则表达式模式,它就用这个模式去匹配字符串中的“分隔符”,然后把匹配到的部分“切掉”,剩下的就是数组元素了。

最基本的用法是这样:

<?php
$str = "苹果,香蕉;橙子 葡萄";
// 按照逗号、分号或空格来分割
$array = preg_split('/[,;\s]+/', $str);
print_r($array);
/*
输出:
Array
(
    [0] => 苹果
    [1] => 香蕉
    [2] => 橙子
    [3] => 葡萄
)
*/

$str2 = "  你好   世界  PHP  ";
// 匹配一个或多个空白字符作为分隔符,并忽略空元素
$array2 = preg_split('/\s+/', $str2, -1, PREG_SPLIT_NO_EMPTY);
print_r($array2);
/*
输出:
Array
(
    [0] => 你好
    [1] => 世界
    [2] => PHP
)
*/
?>

preg_split()
函数有四个参数:

  1. $pattern
    :这就是你的正则表达式,定义了分隔符的模式。
  2. $subject
    :要被分割的字符串。
  3. $limit
    (可选):限制返回的子字符串数量。如果设置了,最后一个元素会包含字符串的剩余部分。默认是-1,表示没有限制。
  4. $flags
    (可选):一些位掩码标志,比如
    PREG_SPLIT_NO_EMPTY
    (不返回空字符串)或
    PREG_SPLIT_DELIM_CAPTURE
    (捕获分隔符)。

我个人觉得,真正让

preg_split()
出彩的,是它对正则表达式的支持。这意味着你可以定义非常精细的分割逻辑,远超单一字符或简单字符串的限制。

立即学习PHP免费学习笔记(深入)”;

在PHP中,
preg_split()
explode()
函数的主要区别和适用场景是什么?

嗯,这是一个老生常谈的问题,但确实很重要。很多初学者会搞混或者不知道什么时候用哪个。简单来说,

explode()
就像一把菜刀,只能用固定的刀刃(一个字符串)去切东西;而
preg_split()
则像一把激光刀,你可以随意调整光束的形状和强度(正则表达式),切割方式灵活得多。

explode()
的特点:

  • 简单直接: 它只接受一个字符串作为分隔符。
  • 速度快: 在处理大量数据且分隔符固定简单时,
    explode()
    通常比
    preg_split()
    快得多,因为它不需要解析正则表达式。
  • 适用场景: 当你的分隔符是一个固定不变的字符或字符串时,比如 CSV 文件中的逗号,或者日志文件中的特定分隔符。
    <?php
    $data = "item1,item2,item3";
    $items = explode(',', $data); // 非常高效
    print_r($items);
    ?>

preg_split()
的特点:

Nanonets
Nanonets

基于AI的自学习OCR文档处理,自动捕获文档数据

下载
  • 强大灵活: 接受正则表达式作为分隔符,这意味着你可以匹配任何复杂的模式,比如“一个或多个空格”、“数字后面跟着冒号”、“任意标点符号”等等。
  • 功能丰富: 支持各种标志,可以控制空元素的去除、分隔符的捕获等。
  • 性能开销: 由于需要解析和执行正则表达式,它通常比
    explode()
    慢,尤其是在简单的分割任务上。
  • 适用场景: 当分隔符不固定、有多种可能、或者需要忽略一些空白字符、甚至是根据某种逻辑模式来分割时,
    preg_split()
    就是你的唯一选择。比如,从一段混合文本中提取出所有单词,忽略所有标点和多余的空格。

我的经验是,如果

explode()
能搞定,就用
explode()
。如果搞不定,或者你预见到未来可能会有更复杂的分割需求,那就直接上
preg_split()
,一步到位。没必要为了那一点点理论上的性能差异,去写一个冗长且容易出错的
str_replace()
strtok()
组合。

如何利用
preg_split()
PREG_SPLIT_DELIM_CAPTURE
标志来保留分隔符?

有时候,我们不仅想把字符串拆开,还想知道“是在哪里拆开的”,也就是想把那些作为分隔符的字符也一并捕获到数组里。

PREG_SPLIT_DELIM_CAPTURE
这个标志就是为此而生的。它会把正则表达式中捕获组(也就是用括号
()
括起来的部分)匹配到的分隔符也作为数组元素返回。

我们来看个例子:

<?php
$logEntry = "ERROR: File not found. WARNING: Disk full.";
// 假设我们想按 "ERROR:" 或 "WARNING:" 来分割,并且想保留这些提示
$parts = preg_split('/(ERROR:|WARNING:)/', $logEntry, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($parts);
/*
输出:
Array
(
    [0] => ERROR:
    [1] =>  File not found.
    [2] => WARNING:
    [3] =>  Disk full.
)
*/
?>

在这个例子里,

(ERROR:|WARNING:)
就是一个捕获组。当
preg_split()
遇到
ERROR:
WARNING:
时,它会把它们当作分隔符,但因为我们使用了
PREG_SPLIT_DELIM_CAPTURE
标志,这些被捕获的分隔符也会被放进结果数组里。同时,我还加了
PREG_SPLIT_NO_EMPTY
,避免因为字符串开头没有内容而产生一个空的数组元素。

需要注意的是,只有正则表达式中的捕获组才会被这个标志捕获。如果你只是写了

/ERROR:|WARNING:/
而没有括号,那么即使加了
PREG_SPLIT_DELIM_CAPTURE
,分隔符也不会被捕获。这是个小细节,但有时候会让人困惑。理解这个,你就能更灵活地处理那些既要分割又要保留上下文信息的场景了。这在解析特定格式的日志、配置文件或者一些自定义协议时特别有用。

处理复杂或多模式分隔符时,
preg_split()
有哪些进阶技巧?

当分隔符模式变得复杂起来,

preg_split()
的真正威力就展现出来了。我们不再满足于简单的逗号或空格,可能需要处理多种标点、不规则的空白,甚至特定格式的标记。

1. 使用字符类和量词处理多变的分隔符: 比如,你想把一个句子按任何标点符号(逗号、句号、问号、感叹号)和空白字符来分割,并且不关心它们出现的次数:

<?php
$sentence = "Hello, world! How are you?";
// 匹配一个或多个标点符号或空白字符
$words = preg_split('/[.,!?;:\s]+/', $sentence, -1, PREG_SPLIT_NO_EMPTY);
print_r($words);
/*
输出:
Array
(
    [0] => Hello
    [1] => world
    [2] => How
    [3] => are
    [4] => you
)
*/
?>

这里的

[.,!?;:\s]+
就是一个字符类,它会匹配方括号内的任何一个字符,
+
表示匹配一个或多个。
\s
是匹配任何空白字符的简写。这种写法非常简洁高效。

2. 使用管道符

|
进行“或”逻辑匹配: 如果你有几种完全不同的分隔符模式,它们之间没有直接的字符类关系,就可以用
|
(或)来连接。

<?php
$dataString =

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

258

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

766

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

219

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

245

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

547

2023.12.06

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号