【问题标题】:Explode string only once on first occurring substring仅在第一个出现的子字符串上分解字符串一次
【发布时间】:2010-12-12 16:48:23
【问题描述】:

preg_match() 给出一个匹配。
preg_match_all() 返回所有匹配。
preg_split() 返回所有拆分。

我怎样才能只在第一场比赛中分裂?

例子:

preg_split("~\n~", $string);

这就是我想要的:

array(
  0 => 'first piece',
  1 => 'the rest of the string
        without any further splits'
)

【问题讨论】:

  • 如果你只是使用 \n 分割成一个数组,你可以使用explode。它比 preg_split 稍快。

标签: php arrays split explode preg-split


【解决方案1】:

只需将数组的 2 部分的 $limit 设置为 2。感谢@BenJames 提及:

preg_split("~\n~", $string, 2);

我测试过,效果很好。

极限参数:

如果指定,则只返回不超过 limit 的子字符串,其余的字符串放在最后一个子字符串中。限制为 -1、0 或 null 表示“无限制”,按照 PHP 的标准,您可以使用 null 跳到 flags 参数。

【讨论】:

    【解决方案2】:

    只需添加限制标志

    preg_split("~\n~", $string, 2);
    

    来自manual

    如果指定,则仅向上添加子字符串 限制与其余部分一起返回 被放置在最后的字符串的 子字符串。

    【讨论】:

    • 你不能,因为它是子字符串。
    • 毛里斯:你的评论意思不清楚,请解释一下
    【解决方案3】:

    这样一个看似简单的任务有相当多的细微差别。在边缘场景中,不同的技术可能会失败或提供偏差的结果。在决定一种技术时,了解输入字符串的质量和边缘情况下所需的输出非常重要。

    长话短说,我可能会使用trim() 来清理任何前导或尾随空白字符。我会在模式中使用preg_split()\R 来一致地匹配不同环境中的不同换行符序列。 +(一个或多个)的量词将在有连续换行符的情况下提供额外的稳定性。

    var_export(
        preg_split('~\R+~', trim($string), 2)
    );
    

    上面将在至少出现一个换行序列时生成一个二元素数组(两者都不会为空),当没有出现换行序列时生成一个一元素数组。

    explode("\n", $string, 2)能满足吗?是的,当然,但这又归结为输入的质量和所需的输出。

    这里有一组测试用例和一些不同的技术来比较好、坏和丑:Demo

    【讨论】:

      【解决方案4】:

      我没有服务器来测试这个。试试:

      preg_split("~\n~",$string,1);
      

      1代表极限:

      限制:如果指定,则仅 返回到 limit 的子字符串 其余的字符串是 放在最后一个子串中。一个限制 -1、0 或 null 表示“无限制”,并且, 作为 PHP 的标准,您可以使用 null 跳到 flags 参数。

      【讨论】:

      • 它是子字符串,你不能使用 $limit 标志。
      • 限制为 1 根本不会拆分字符串。
      • @Ben:我显然是错的,但是当将手册应用于 Albus 的请求并假设限制为 1 时,它会显示为:“如果指定,则只有不超过 1 的子字符串是将字符串的其余部分放在最后一个子字符串中返回。”对我来说,这意味着无论您指定的限制如何(例如 $limit),总会有一个值为 $limit+1 的结果子字符串,其中包含其余内容。
      • 基于 RMcLeod 接受的回应,我承认失败了。甚至 'rtfm' 也不适用于我,因为我误解了它:-)
      猜你喜欢
      • 2014-10-12
      • 2014-03-21
      • 2011-12-19
      • 2021-12-08
      • 2017-12-15
      • 2011-08-25
      • 2018-02-05
      相关资源
      最近更新 更多