使用PHP中的正则表达式将多行字符串转换为多元素数组

时间:2012-01-11 13:35:46

标签: php regex newline preg-match-all

我需要拆分以下字符串并将每个新行放入一个新的数组元素中。

this is line a.(EOL chars = '\r\n' or '\n')
(EOL chars)
this is line b.(EOL chars)
this is line c.(EOL chars)
this is the last line d.(OPTIONAL EOL chars)

(请注意,最后一行可能没有任何EOL字符。字符串有时也只包含1行,根据定义,它只是最后一行。)

必须遵循以下规则:

  • 空行(如第二行)应该被丢弃而不能放入 进入阵列。
  • 不应包括EOL字符,否则 我的字符串比较失败。

所以这应该导致以下数组:

[0] => "this is line a."
[1] => "this is line b."
[2] => "this is line c."
[3] => "this is the last line d."

我尝试了以下操作:

$matches = array();
preg_match_all('/^(.*)$/m', $str, $matches);
return $matches[1];

$ matches [1]确实包含每一个新行,但是:

  • 还包括空行
  • 似乎一个'\ r'字符无论如何都会在数组中的字符串末尾被走私。我怀疑这与正则表达式范围有关。'其中包括除'\ n'以外的所有内容。

无论如何,我一直在玩'\ R'和诸如此类的东西,但我找不到符合我上面概述的两条规则的好的正则表达式模式。有什么帮助吗?

4 个答案:

答案 0 :(得分:5)

只需使用preg_split()拆分正则表达式:

// Split on \n, \r is optional..
// The last element won't need an EOL.
$array = preg_split("/\r?\n/", $string);

注意,如果有一个尾随换行符,您可能还需要trim($string),因此最终不会有一个额外的空数组元素。

答案 1 :(得分:3)

只有一个功能 - file()

答案 2 :(得分:1)

我认为preg_split是可行的方法......您可以使用适当的正则表达式将任何EOL字符用作分隔符。

如下所示(正则表达式需要更复杂一点):

$array = preg_split('/[\n\r]+/', $string);

希望有所帮助,

答案 3 :(得分:1)

使用preg_split功能:

$array = preg_split('/[\r\n]+/', $string);