正则表达式:在第一个换行符处拆分字符串

6
我想在第一个换行处分割字符串,而不是第一个空行。
'/^(.*?)\r?\n\r?\n(.*)/s'(第一个空行)
例如,如果我有:
$str = '2099测试\n你确定你要继续吗\n这里还有一些其他的字符串...';
match[1] = '2099 test'
match[2] = 'Are you sure you want to continue\n some other string here...'

还有一个问题,是否可以在第二个换行处也进行操作呢? - delimiter2
6个回答

13

preg_split()函数有一个可以利用的limit参数。你可以简单地这样做:

$lines = preg_split('/\r\n|\r|\n/', $str, 2);

在可能的情况下,使用字符串操作而不是正则表达式通常更好。 - Justin Morgan
不起作用。您正在要求 preg_split 返回大小为 1 的数组。 - codaddict
刚刚注意到了自己的错误,已经纠正了。 - Riimu

6
<?php
$str = "2099 test\nAre you sure you want to continue\n some other string here...";

$match = explode("\n",$str, 2);
print_r($match);


?>

返回值

Array
(
    [0] => 2099 test
    [1] => Are you sure you want to continue
 some other string here...
)

explode函数的最后一个参数是你想要将字符串分割成的元素数量。


1

您可以使用preg_split函数,例如:

$arr = preg_split("/\r?\n/",$str,2);

在 Ideone 上查看


1
通常只需删除 \r?\n
'/^(.*?)\r?\n(.*)/s'

1

第一行换行:

$match = preg_split('/\R/', $str, 2);

第一行空白:

$match = preg_split('/\R\R/', $str, 2);

处理所有不同的换行方式。

还有一个关于在第二个换行符上分割的问题。这是我的实现(可能不是最有效的...还注意它会用PHP_EOL替换一些换行符)。

function split_at_nth_line_break($str, $n = 1) {
    $match = preg_split('/\R/', $str, $n+1);
    if (count($match) === $n+1) {
        $rest = array_pop($match);
    }
    $match = array(implode(PHP_EOL, $match));
    if (isset($rest)) {
        $match[] = $rest;
    }
    return $match;
}

$match = split_at_nth_line_break($str, 2);

0

那里的所有答案要么使用正则表达式,要么使用一些奇怪的Perl特定文件I/O重定向。 - user9645

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接