仅在第一次出现的子字符串上分解字符串一次

发布于 2024-08-10 11:10:58 字数 356 浏览 6 评论 0原文

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'
)

preg_match() gives one match.
preg_match_all() returns all matches.
preg_split() returns all splits.

How can I split only on the first match?

Example:

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

This is what I want:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甲如呢乙后呢 2024-08-17 11:10:58

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

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

我测试过,效果很好。

极限参数:

如果指定,则仅返回达到 limit 的子字符串,并将字符串的其余部分放置在最后一个子字符串中。 -1、0 或 null 的限制意味着“无限制”,并且按照 PHP 的标准,您可以使用 null 跳到 flags 参数。

Simply set $limit to 2 for 2 parts of the array. Thanks to @BenJames for mentioning:

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

I tested and it works fine.

The limit argument:

If specified, then only substrings up to limit are returned with the rest of the string being placed in the last substring. A limit of -1, 0 or null means "no limit" and, as is standard across PHP, you can use null to skip to the flags parameter.

梦晓ヶ微光ヅ倾城 2024-08-17 11:10:58

只需添加限制标志

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

来自 手册

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

Just add the limit flag

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

From the manual

If specified, then only substrings up
to limit are returned with the rest
of the string being placed in the last
substring.

我的影子我的梦 2024-08-17 11:10:58

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

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

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

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

explode("\n", $string, 2) 足以满足吗?是的,当然,但这又取决于输入的质量和所需的输出。

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

There is a fair amount of nuance to such a seemingly simple task. Different techniques can fail or offer skewed results in fringe scenarios. It is important to understand the quality of the input string and your desired output for fringe cases when deciding on a technique.

The long story short, I would probably be using trim() to sanitize any leading or trailing whitespace characters. I would use preg_split() with \R in the pattern to consistently match different newline sequences across different environments. A quantifier of + (one or more) will provide additional stability in case there are consecutive newline characters.

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

The above will generate a two-element array (neither of which will be empty) when at least one newline sequence occurs and a one-element array when no newline sequence occurs.

Can explode("\n", $string, 2) be enough to satisfy? Yes, sure, but again it comes down to the quality of the input and the desired output.

Here is a battery of test cases and some different techniques to compare the good, the bad and the ugly: Demo.

夏末染殇 2024-08-17 11:10:58

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

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

1 代表极限:

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

I don't have a server to test this on. Try:

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

The 1 represents the limit:

Limit: If specified, then only
substrings up to limit are returned
with the rest of the string being
placed in the last substring. A limit
of -1, 0 or null means "no limit" and,
as is standard across PHP, you can use
null to skip to the flags parameter.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文