PHP preg_split添加了一个空数组键,可以';由于存在';s a';空间';在里面

PHP preg_split添加了一个空数组键,可以';由于存在';s a';空间';在里面,php,regex,Php,Regex,我试图使用preg_split分割段落之间新行数为奇数的文本,但其中一些新行(也是奇数)上也有一些“空格”(空白),但我使用的正则表达式无法绕过这些“空格”,而是将它们包含在我的数组中: Array ( [0] => Dummy text [2] => [3] => more dummy text after some lines [5] => [7] => even more dummy text ) 下面是正则

我试图使用
preg_split
分割段落之间新行数为奇数的文本,但其中一些新行(也是奇数)上也有一些“空格”(空白),但我使用的正则表达式无法绕过这些“空格”,而是将它们包含在我的数组中:

Array
(
    [0] => Dummy text
    [2] =>  
    [3] => more dummy text after some lines
    [5] =>  
    [7] => even more dummy text
) 
下面是正则表达式示例:

到目前为止,我已经使用了一个
foreach
循环来清理它:

foreach($arr as $v){
    if(!empty($v){
         //do something
    }
}

但是我很确定有一个更好的方法来解决这个问题:-s

使用
PREG\u SPLIT\u NO\u EMPTY
标志

$p ='
foo

bar


biz

';
    
print_r(preg_split('/(\r\n|\n|\r)/', $p, 0, PREG_SPLIT_NO_EMPTY));
输出:

Array
(
    [0] => foo
    [1] => bar
    [2] => biz
)
Array (
    [0] => Dummy text
    [1] => more dummy text after some lines
    [2] => even more dummy text 
)

供参考

PREG\u SPLIT\u NO\u EMPTY

如果设置了此标志,preg_split()将只返回非空工件

作为奖金

像这样的正则表达式满足您的需要。因为
\r
在里面,
\r\n
也在里面,
\n
也在里面(大惊喜吧)。您可能会想“在windows上,它是\r\n的,不会被拆分为2x”。当然会,但这并不重要,因为并没有空的标志

即使这让您担心,您也可以在末尾添加一个
+
,如
'/[\r\n]+/'
,因此:-p,现在我想到它,它可能更“快”,但我跑题了

另外,如果您将最后一个标记与
+
一起使用,则您甚至不需要该标记(如果您将其修剪)。所以有两个答案


简单

使用
PREG\u SPLIT\u NO\u EMPTY
标志

$p ='
foo

bar


biz

';
    
print_r(preg_split('/(\r\n|\n|\r)/', $p, 0, PREG_SPLIT_NO_EMPTY));
输出:

Array
(
    [0] => foo
    [1] => bar
    [2] => biz
)
Array (
    [0] => Dummy text
    [1] => more dummy text after some lines
    [2] => even more dummy text 
)

供参考

PREG\u SPLIT\u NO\u EMPTY

如果设置了此标志,preg_split()将只返回非空工件

作为奖金

像这样的正则表达式满足您的需要。因为
\r
在里面,
\r\n
也在里面,
\n
也在里面(大惊喜吧)。您可能会想“在windows上,它是\r\n的,不会被拆分为2x”。当然会,但这并不重要,因为并没有空的标志

即使这让您担心,您也可以在末尾添加一个
+
,如
'/[\r\n]+/'
,因此:-p,现在我想到它,它可能更“快”,但我跑题了

另外,如果您将最后一个标记与
+
一起使用,则您甚至不需要该标记(如果您将其修剪)。所以有两个答案

简单

您可以使用
PREG_SPLIT_NO_EMPTY
标志从输出中删除完全空的值,但是您还需要在正则表达式中包含新行附近的空格,以避免在输出中获得仅包含空格的行。这将起作用(
$p
是从您的演示中复制的):

输出:

Array
(
    [0] => foo
    [1] => bar
    [2] => biz
)
Array (
    [0] => Dummy text
    [1] => more dummy text after some lines
    [2] => even more dummy text 
)

您可以使用
PREG\u SPLIT\u NO\u EMPTY
标志从输出中删除完全为空的值,但您还需要在正则表达式中包含新行附近的空格,以避免在输出中获得仅包含空格的行。这将起作用(
$p
是从您的演示中复制的):

输出:

Array
(
    [0] => foo
    [1] => bar
    [2] => biz
)
Array (
    [0] => Dummy text
    [1] => more dummy text after some lines
    [2] => even more dummy text 
)

嘿@Nick,非常感谢你花时间回答!别担心。很高兴我能帮忙。嘿@Nick,非常感谢你花时间回答!别担心。很高兴我能帮上忙。嘿@ArtisticPhoenix,谢谢你花时间来帮助我,尽管我使用了之前的答案,因为答案很接近。谢谢!X_XHey@ArtisticPhoenix,感谢您花时间帮助我,尽管我使用了之前的答案,因为答案很接近X_X谢谢您!X_X