php如何分割一个字符串?php字符串分割函数使用教程

PHP中分割字符串主要使用explode()、str_split()和preg_split()函数。explode()按指定分隔符拆分字符串,适用于有明确分隔符的场景;str_split()按固定长度或单个字符分割,适合无分隔符但需等长切分的情况;preg_split()支持正则表达式,可处理复杂模式的分割需求。三者在处理空字符串或不存在分隔符时表现不同:explode()在找不到分隔符时返回原字符串组成的数组,空字符串作分隔符会报错;str_split()对空字符串返回空数组,长度参数非法会报错;preg_split()在模式不匹配时返回原字符串组成的数组,空模式会报错。选择合适函数需根据具体分割逻辑和边界情况处理。

php如何分割一个字符串?php字符串分割函数使用教程

PHP中分割字符串主要依赖

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

函数,它能根据指定的分隔符将字符串拆分成一个数组。如果需要更灵活、基于模式的分割,

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

函数则是更强大的选择,它支持正则表达式。对于按固定长度或单个字符分割,则可以使用

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

解决方案

在PHP中,处理字符串分割的需求非常普遍,我们通常会用到以下几个核心函数,它们各有侧重,满足不同场景下的需求。

1.

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:最常用的分隔符分割

这是我个人在日常开发中最常用到的字符串分割函数。它的核心思想是“以特定字符或字符串为界,将一个大字符串切成小块”。

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

  • 语法:

    explode(string $delimiter, string $string, int $limit = PHP_INT_MAX): array
    登录后复制
  • $delimiter
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    : 用来分割字符串的字符或字符串。

  • $string
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    : 待分割的原始字符串。

  • $limit
    登录后复制
    登录后复制
    登录后复制
    登录后复制

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

    • 正数:返回最多
      $limit
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      个元素,最后一个元素包含字符串的剩余部分。

    • 负数:返回除最后
      -limit
      登录后复制

      个元素之外的所有元素。

    • 0或省略:返回所有分割后的元素。

示例:

$sentence = "Hello,world,this,is,a,test";
$words = explode(",", $sentence);
print_r($words);
// 输出: Array ( [0] => Hello [1] => world [2] => this [3] => is [4] => a [5] => test )

$path = "/usr/local/bin/php";
$parts = explode("/", $path, 3); // 限制为3个元素
print_r($parts);
// 输出: Array ( [0] => [1] => usr [2] => local/bin/php )
登录后复制

2.

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:按字符或固定长度分割

当你的需求不是基于某个分隔符,而是想把字符串拆成单个字符,或者每隔N个字符切一刀时,

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

就派上用场了。

  • 语法:

    str_split(string $string, int $length = 1): array
    登录后复制
  • $string
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    : 待分割的原始字符串。

  • $length
    登录后复制
    登录后复制

    : 可选参数,指定每个子字符串的长度。默认为1,即按单个字符分割。

示例:

$text = "PHP";
$chars = str_split($text);
print_r($chars);
// 输出: Array ( [0] => P [1] => H [2] => P )

$data = "1234567890";
$chunks = str_split($data, 3); // 每3个字符一组
print_r($chunks);
// 输出: Array ( [0] => 123 [1] => 456 [2] => 789 [3] => 0 )
登录后复制

3.

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:强大的正则表达式分割

这是当

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

无法满足你复杂分割逻辑时的“终极武器”。它允许你使用正则表达式作为分隔符,这意味着你可以按任何你想要的模式来分割字符串,比如多个空格、任何非字母数字字符,甚至是更复杂的自定义模式。

  • 语法:

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

    : 正则表达式模式。

  • $subject
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    : 待分割的原始字符串。

  • $limit
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    : 可选参数,与

    explode()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $limit
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    类似。

  • $flags
    登录后复制

    : 可选参数,用于控制分割行为,如

    PREG_SPLIT_NO_EMPTY
    登录后复制
    登录后复制

    (不返回空字符串)、

    PREG_SPLIT_DELIM_CAPTURE
    登录后复制
    登录后复制

    (捕获分隔符)等。

示例:

$sentence = "Hello   world, this is a test.";
// 按一个或多个空格、逗号或点号分割
$words = preg_split("/[/s,.]+/", $sentence, -1, PREG_SPLIT_NO_EMPTY);
print_r($words);
// 输出: Array ( [0] => Hello [1] => world [2] => this [3] => is [4] => a [5] => test )

$data = "item1|item2;item3";
// 按管道符或分号分割
$items = preg_split("/[|;]/", $data);
print_r($items);
// 输出: Array ( [0] => item1 [1] => item2 [2] => item3 )
登录后复制

PHP字符串分割,

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

函数是如何工作的?它与

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

有何不同?

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

函数的工作机制其实非常直观:它会在给定的字符串中寻找你指定的分隔符,每找到一个,就把它当作一个“切割点”,然后将分隔符两侧的内容作为数组的一个元素。这个过程会一直重复,直到字符串的末尾或者达到你设定的

limit
登录后复制

限制。举个例子,如果我有一个字符串

"apple-banana-orange"
登录后复制

,用

"-"
登录后复制
登录后复制
登录后复制

explode
登录后复制

,它就会先在第一个

"-"
登录后复制
登录后复制
登录后复制

处切开,得到

"apple"
登录后复制

"banana-orange"
登录后复制
登录后复制

,然后再在第二个

"-"
登录后复制
登录后复制
登录后复制

处切开

"banana-orange"
登录后复制
登录后复制

,最终形成

["apple", "banana", "orange"]
登录后复制

这样一个数组。它非常适合处理那些结构化、有明确分隔符的数据,比如CSV行、URL参数等。

VisDoc

VisDoc

AI文生图表工具

VisDoc29


查看详情
VisDoc

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

则完全是另一种思路。它不关心任何分隔符,它只关心“长度”。你可以告诉它,把字符串按单个字符拆开,或者每两个字符、每三个字符拆开。比如,

str_split("ABCD", 2)
登录后复制

会得到

["AB", "CD"]
登录后复制

。它就像一把尺子,按照固定的刻度去量和切分字符串。我个人在使用时,如果只是简单地按逗号、空格或者换行符来分,

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

几乎是我的首选,因为它直观且高效。但如果我需要把一个长字符串拆成单个字符,或者每N个字符一组(比如处理固定长度的协议字段),那

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

就派上用场了。两者之间最大的区别在于:

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

是基于“内容”(分隔符)来分割,而

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

是基于“位置”(长度)来分割。理解这个核心差异,就能更好地选择合适的工具

什么时候应该使用

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

而不是

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

这是一个我经常思考的问题,因为在实际开发中,很多时候

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

就能搞定,但有些场景下,你真的会发现

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

力不从心,这时候就是

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

大显身手的时候了。

你需要

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的典型场景包括:

  1. 多个分隔符:

    explode()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    只能接受一个分隔符。如果你的字符串可能由逗号、分号或竖线等多种符号分隔,

    explode()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    就无能为力了。而

    preg_split()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    可以轻松应对,比如

    preg_split("/[,;|]/", $str)
    登录后复制

    就能同时按逗号、分号和竖线分割。

  2. 不确定的分隔符: 比如,你希望按任意数量的空白字符(空格、制表符、换行符)来分割。

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

    只能按单个空格分割,多个空格之间会产生空字符串。但

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

    就能完美处理,

    /s+
    登录后复制

    表示一个或多个空白字符,并且结合

    PREG_SPLIT_NO_EMPTY
    登录后复制
    登录后复制

    标志,可以避免生成空数组元素。

  3. 模式匹配作为分隔符: 你可能想按数字、非字母字符、或者某种特定格式的日期来分割。这些都是

    explode()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    无法理解的“模式”。例如,我想把一个字符串

    "user123admin456data"
    登录后复制

    按其中的数字来分割,

    preg_split("//d+/", $str)
    登录后复制

    就能得到

    ["user", "admin", "data"]
    登录后复制

  4. 捕获分隔符: 有时你不仅想分割字符串,还想知道是哪个分隔符导致了分割。

    preg_split()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    PREG_SPLIT_DELIM_CAPTURE
    登录后复制
    登录后复制

    标志允许你在结果数组中包含匹配到的分隔符。这在解析复杂文本格式时非常有用,比如你可能需要知道一个数学表达式中的操作符。

坦白说,刚开始接触正则表达式的时候,我觉得它像一门独立的语言,有点让人望而却步。但一旦你掌握了它的基本语法,

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

在处理那些不规则、多变的分隔符时,简直是神器。它能帮你省去很多循环和条件判断的麻烦,让代码更简洁、更强大。虽然学习曲线比

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

陡峭,但它的能力范围是

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

望尘莫及的。所以,当你的分割需求超越了简单的单字符或单字符串分隔时,毫不犹豫地转向

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

吧。

处理空字符串或不存在的分隔符时,这些函数会有什么表现?

在使用这些字符串分割函数的时候,我发现最容易踩坑的就是这些边界情况。了解它们在面对空字符串或找不到分隔符时的行为,对于避免潜在的bug至关重要。

1.

explode()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的行为:

  • 分隔符不存在: 如果

    $delimiter
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $string
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    中找不到,

    explode()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    会返回一个包含原始

    $string
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    作为唯一元素的数组。

    $str = "hello world";
    $result = explode(",", $str);
    print_r($result); // Array ( [0] => hello world )
    登录后复制

    这和一些人可能预期的返回

    false
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    或者空数组不同,需要特别注意。

  • 空字符串作为分隔符: PHP会发出一个

    E_WARNING
    登录后复制
    登录后复制
    登录后复制

    警告,因为空字符串不能作为分隔符。它会返回

    false
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $str = "abc";
    $result = explode("", $str); // 产生警告,并返回 false
    登录后复制
  • 空字符串作为待分割字符串: 如果

    $string
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    是空字符串

    ""
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    • $delimiter
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      非空时,

      explode()
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      会返回一个包含一个空字符串元素的数组

      [""]
      登录后复制

      $str = "";
      $result = explode(",", $str);
      print_r($result); // Array ( [0] => )
      登录后复制
    • $delimiter
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      为空字符串时(如上所述),会返回

      false
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      并发出警告。

2.

str_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的行为:

  • 空字符串作为待分割字符串: 如果

    $string
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    是空字符串

    ""
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    str_split()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    会返回一个空数组

    []
    登录后复制
    登录后复制

    $str = "";
    $result = str_split($str);
    print_r($result); // Array ( )
    登录后复制
  • $length
    登录后复制
    登录后复制

    参数为0或负数: PHP会发出一个

    E_WARNING
    登录后复制
    登录后复制
    登录后复制

    警告,并返回

    false
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $str = "abc";
    $result = str_split($str, 0); // 产生警告,并返回 false
    登录后复制

3.

preg_split()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的行为:

  • 模式不匹配: 如果

    $pattern
    登录后复制
    登录后复制
    登录后复制

    $subject
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    中找不到任何匹配,

    preg_split()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    会返回一个包含原始

    $subject
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    作为唯一元素的数组。这和

    explode()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    的行为是一致的。

    $str = "hello world";
    $result = preg_split("/-/", $str);
    print_r($result); // Array ( [0] => hello world )
    登录后复制
  • 空字符串作为待分割字符串: 如果

    $subject
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    是空字符串

    ""
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    preg_split()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    会返回一个空数组

    []
    登录后复制
    登录后复制

    $str = "";
    $result = preg_split("//s+/", $str);
    print_r($result); // Array ( )
    登录后复制
  • 空模式: 如果

    $pattern
    登录后复制
    登录后复制
    登录后复制

    是空字符串

    ""
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    ,PHP会发出一个

    E_WARNING
    登录后复制
    登录后复制
    登录后复制

    警告,并返回

    false
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $str = "abc";
    $result = preg_split("//", $str); // 产生警告,并返回 false
    登录后复制

    实际上,你很少会用空字符串作为正则表达式模式,通常会用

    .
    登录后复制

    来匹配任何字符。

总的来说,处理这些边界情况时,最稳妥的做法是在使用函数之前,先对输入字符串进行检查,比如

if (!empty($str))
登录后复制

,或者在处理结果数组时,也检查其是否为空。这样可以有效避免不必要的错误和警告。

以上就是php如何分割一个字符串?php字符串分割函数使用教程的详细内容,更多请关注php中文网其它相关文章!

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

发表回复

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