preg_split()函数按换行符拆分的正则表达式

10

这是我的文件:

0.0 5.0 5.0 6.0 7.0 2.0 5.0 2.0 1.0 5.0 5.0 1.0 2.0 7.1 5.0
5.0 0.0 5.0 5.0 5.0 2.0 5.0 1.0 5.0 6.0 6.0 6.0 6.0 1.0 7.1
5.0 5.0 0.0 6.0 1.0 6.0 5.0 5.0 1.0 6.0 5.0 7.0 1.0 5.0 6.0
6.0 5.0 6.0 0.0 5.0 2.0 1.0 6.0 5.0 6.0 2.0 1.0 2.0 1.0 5.0
7.0 5.0 1.0 5.0 0.0 7.0 1.0 1.0 2.0 1.0 5.0 6.0 2.0 2.0 5.0
2.0 2.0 6.0 2.0 7.0 0.0 5.0 5.0 6.0 5.0 2.0 5.0 1.0 2.0 5.0
5.0 5.0 5.0 1.0 1.0 5.0 0.0 2.0 6.0 1.0 5.0 7.0 5.0 1.0 6.0
7.0 1.0 5.0 1.0 2.0 2.0 1.0 5.0 6.0 5.0 2.0 6.0 7.0 0.0 5.0
5.0 7.0 6.0 5.0 5.0 5.0 6.0 2.0 6.0 2.0 1.0 5.0 6.0 5.0 0.0
我会将其按 \n 分割,并将每行返回为一个数组。如何进行正则表达式匹配?
$rows = preg_split('$regular_expression', $content);

在提取了所有行之后,我该如何提取由反斜杠空格隔开的每个值?

$values_in_a_row = preg_split('$regular_expression', $a_row);

这里是我正在尝试做的文本http://regexr.com?2v23c

5个回答

44

如果你因为不知道每个换行符是 \n 还是 \r\n 或者 \r 而遇到问题,那么以上的答案都不能解决你的问题,你可以尝试使用正则表达式。我所做的是

$lines = preg_split("/(\r\n|\n|\r)/",$content);

然后您可以使用被接受的答案来分割空格。


5
这行代码的作用是将$content字符串按照换行符进行分割,并将结果存储在$lines数组中。其中preg_split函数使用正则表达式模式'\R'来匹配不同类型的换行符,以确保在各种操作系统和文本格式中都能正确地进行分割。 - Alex Skrypnyk
1
'\R' 会打断中文字符 先。 - John Wong

8

不需要使用正则表达式:

<?php
    $data = explode("\n", $data); // preg_split('#\n#', $data); Please don't
    foreach($data as &$row) {
        $row = explode(' ', $row); // preg_split('#\s#', $row); Seriously
    }
    print_r($data);
?>

<test></test>

1
@MichaelKrelin-hacker 在这种情况下,OP不应该使用正则表达式。 - Tom
1
@MichaelKrelin-hacker OP让我非常生气,情不自禁。为了完美无缺,我编辑了代码的注释。 - Tom
4
问题在于,如果它没有使用“\n”换行字符,该怎么办? - Liam W
@LiamW 正是我遇到的问题。请看我的回答。 - Bryan
10
这并没有回答这个问题。并非所有字符串都使用\n作为换行符。 - Abhi Beckert
显示剩余10条评论

6
$rowsapart = preg_split("/\n/",$rowstogether);

$colspart = preg_split("/\s/",$colstogether);

我测试过了。链接对我来说打不开,但我猜它使用了不同口味的正则表达式。 - Michael Krelin - hacker
这个只有代码的答案的问题在于,提问者和研究人员可能不知道如何设置这个技巧。换句话说,他们可能不知道如何声明$rowstogether$colstogether - mickmackusa

2
无需使用正则表达式,可以使用explode()代替:
<?php

    $file = <<<EOF
    0.0 5.0 5.0 6.0 7.0 2.0 5.0 2.0 1.0 5.0 5.0 1.0 2.0 7.1 5.0
    5.0 0.0 5.0 5.0 5.0 2.0 5.0 1.0 5.0 6.0 6.0 6.0 6.0 1.0 7.1
    5.0 5.0 0.0 6.0 1.0 6.0 5.0 5.0 1.0 6.0 5.0 7.0 1.0 5.0 6.0
    6.0 5.0 6.0 0.0 5.0 2.0 1.0 6.0 5.0 6.0 2.0 1.0 2.0 1.0 5.0
    7.0 5.0 1.0 5.0 0.0 7.0 1.0 1.0 2.0 1.0 5.0 6.0 2.0 2.0 5.0
    2.0 2.0 6.0 2.0 7.0 0.0 5.0 5.0 6.0 5.0 2.0 5.0 1.0 2.0 5.0
    5.0 5.0 5.0 1.0 1.0 5.0 0.0 2.0 6.0 1.0 5.0 7.0 5.0 1.0 6.0
    7.0 1.0 5.0 1.0 2.0 2.0 1.0 5.0 6.0 5.0 2.0 6.0 7.0 0.0 5.0
    5.0 7.0 6.0 5.0 5.0 5.0 6.0 2.0 6.0 2.0 1.0 5.0 6.0 5.0 0.0
    EOF;

    $rows = explode("\n", $file);
    print_r($rows);
    echo "\n\n"; //Spacing

    $numbers_in_a_row = explode(" ", $rows[0]);
    print_r($numbers_in_a_row);

?>

Live Example


1
preg_split("/\R/", $content); 

这是一种最可靠的方法,用于按新行分割文本,如果您确定传入内容具有Unicode格式。 /\R/匹配ASCII范围内的任何Unicode换行序列。它等同于:
/(?>\r\n|\n|\r|\f|\x0b|\x85)/

这并不会将行分开。你只解决了问题的一半。 - mickmackusa

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