如何用PHP将字符串按自定义规则转为数组?preg_split实例

preg_split函数通过正则表达式实现灵活的字符串分割,适用于多重、可变或复杂分隔符场景,支持过滤空元素和捕获分隔符,远超explode的固定字符分割能力。

如何用php将字符串按自定义规则转为数组?preg_split实例

PHP中,要按自定义规则将字符串转为数组,

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

函数是你的利器。它通过正则表达式来定义分隔符,提供了极大的灵活性,远超简单的固定字符分割,能够处理各种复杂的分隔场景。

解决方案

Okay,直接说解决方案,PHP里处理这类需求,

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

简直是为“自定义规则”而生的。它不像

explode
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

那样只能用固定字符串做分隔符,

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

能吃下任何正则表达式,这意味着你可以定义出非常复杂的分割逻辑。

基本用法是这样的:

preg_split(string $pattern, string $subject, int $limit = -1, int $flags = 0): array
登录后复制

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

  • $pattern
    登录后复制

    :就是你的正则表达式,决定了“按什么规则”来分割。

  • $subject
    登录后复制

    :要被分割的那个字符串。

  • $limit
    登录后复制

    :可选参数,限制返回数组元素的数量。

  • $flags
    登录后复制

    :一些行为修饰符,比如是否保留空字符串,是否捕获分隔符等。

举个最简单的例子,如果你想用逗号或分号来分割一个字符串:

$str = "apple,banana;orange,grape";
$parts = preg_split('/[,;]/', $str);
print_r($parts);
// 输出: Array ( [0] => apple [1] => banana [2] => orange [3] => grape )
登录后复制

这只是冰山一角。有时候,你可能遇到这样的情况:数据里既有空格,又有逗号,甚至还有多个连续的分隔符,而且你还不想让它们产生空数组元素。这时,

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的强大就体现出来了。

$str = "  item1 , item2   ;  item3  ";
// 规则:匹配一个或多个空格、逗号或分号,并忽略空元素
$parts = preg_split('/[ ,;]+/', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($parts);
// 输出: Array ( [0] => item1 [1] => item2 [2] => item3 )
登录后复制

这里,

[ ,;]+
登录后复制

匹配一个或多个空格、逗号或分号。

PREG_SPLIT_NO_EMPTY
登录后复制
登录后复制

这个 flag 确保了结果数组里不会有空字符串。这在处理用户输入或者解析日志文件时特别有用,能省去很多后续的

array_filter
登录后复制
登录后复制
登录后复制

操作。

我个人觉得,

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的真正魅力在于它能处理那些“不规则”的分隔符。比如,你可能需要分割一个字符串,但分隔符本身也可能包含在结果里,或者你需要知道每个分割出来的部分在原字符串中的起始位置。

$logLine = "INFO: User logged in. ERROR: Invalid password.";
// 假设你想把 INFO: 和 ERROR: 作为分隔符,并且想保留它们
$segments = preg_split('/(INFO:|ERROR:)/', $logLine, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($segments);
// 输出: Array ( [0] => INFO: [1] => User logged in. [2] => ERROR: [3] => Invalid password. )
登录后复制

这里,通过将分隔符放在捕获组

()
登录后复制

中,并结合

PREG_SPLIT_DELIM_CAPTURE
登录后复制
登录后复制

标志,我们就能在结果中捕获到分隔符本身。这在解析一些结构化的日志或协议时,提供了非常大的便利。

什么时候应该优先选择

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

而不是

explode
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

这个问题其实挺核心的,我经常看到一些初学者在简单场景下滥用

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

,或者在复杂场景下硬用

explode
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

然后写一堆

str_replace
登录后复制

array_filter
登录后复制
登录后复制
登录后复制

。我的经验是,当你发现你的分隔符不再是“一个固定不变的字符串”时,就该考虑

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

了。

explode
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

很简单,它只能接受一个字符串作为分隔符。比如

explode(',', $str)
登录后复制

,这就限定死了,你只能用逗号。但现实世界的数据往往没那么规整:

  • 多重分隔符: 你的数据可能用逗号、分号,甚至管道符

    |
    登录后复制

    来分隔。

    explode
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    搞不定,

    preg_split
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    一个

    /[;,|]/
    登录后复制

    就解决了。

  • 可变长度分隔符: 比如你可能想用一个或多个空格来分割,

    explode(' ', $str)
    登录后复制

    会把连续的空格当成多个分隔符,产生空元素。

    preg_split('//s+/', $str)
    登录后复制

    则能把所有连续的空白符都当成一个分隔符。

  • 复杂的模式匹配: 比如你想用“数字后面跟着一个点”作为分隔符(

    //d+/./
    登录后复制

    ),或者想排除某些特定内容作为分隔符。这完全是正则表达式的领域。

  • 自动过滤空元素:

    PREG_SPLIT_NO_EMPTY
    登录后复制
    登录后复制

    这个flag,能让你在分割的同时,自动过滤掉因为连续分隔符或字符串开头/结尾的分隔符产生的空数组元素,这比先

    explode
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    array_filter
    登录后复制
    登录后复制
    登录后复制

    要优雅和高效得多。

  • 捕获分隔符: 就像前面提到的

    PREG_SPLIT_DELIM_CAPTURE
    登录后复制
    登录后复制

    ,如果你不仅想分割,还想知道“是用什么分割的”,

    explode
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    是无能为力的。

当然,这并不是说

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

就一定比

explode
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

好。

explode
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

在处理简单、固定分隔符的场景下,性能通常会比

preg_split
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

要好,因为它不需要启动正则表达式引擎。所以,如果你的需求只是

以上就是如何用PHP将字符串按自定义规则转为数组?preg_split实例的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1481289.html

发表回复

Your email address will not be published. Required fields are marked *