可靠地从字符串中删除换行符

时间:2010-02-16 16:37:10

标签: php

字符串输入来自textarea,用户应该在新行上输入每一个项目。

处理表单时,很容易将textarea输入分解为单个项目数组,如下所示:

$arr = explode("\n", $textareaInput);

它工作正常,但我担心它在不同系统中无法正常工作(我目前只能在Windows中测试)。我知道新行在不同的平台上表示为\ r \ n或者只是\ r \ n。上面的代码行是否也可以在Linux,Solaris,BSD或其他操作系统下正常工作?

6 个答案:

答案 0 :(得分:8)

您可以使用preg_split来执行此操作。

$arr = preg_split('/[\r\n]+/', $textareaInput);

它会将其分为\r\n字符的任意组合。您还可以使用\s包含任何空白字符。

修改
在我看来,虽然前面的代码工作正常,但它也删除了空行。如果你想保留空行,你可能想尝试这样做:

$arr = preg_split('/(\r\n|[\r\n])/', $textareaInput);

它基本上从查找Windows版本\r\n开始,如果失败,它会查找旧的Mac版本\r或Unix版本\n

例如:

<?php
$text = "Windows\r\n\r\nMac\r\rUnix\n\nDone!";
$arr = preg_split('/(\r\n|[\r\n])/', $text);
print_r($arr);
?>

打印:

Array
(
    [0] => Windows
    [1] => 
    [2] => Mac
    [3] => 
    [4] => Unix
    [5] => 
    [6] => Done!
)

答案 1 :(得分:4)

$arr = preg_split( "/[\n\r]+/", $textareaInput );

答案 2 :(得分:4)

'\ r'本身作为行终止符是一个旧的约定,不再使用了(不是因为基于Unix的OSX)。

您的explode会好的。只需trim关闭Windows用户的每个结果元素中的'\ n'。

答案 3 :(得分:1)

您可以规范化输入:

<?php

$foo = strtr($foo, array(
    "\r\n" => "\n",
    "\r" => "\n",
    "\n" => "\n",
));

?>

或者,您可以使用正则表达式进行爆炸:

<?php

$foo = preg_split ("/[\r\n]+/", $foo);

?>

答案 4 :(得分:0)

以下代码必须完成工作

<?php
$split = preg_split('/[\r\n]+/', $src);
foreach ($split as $k=>$string) {
    $split[$k] = trim($string);
    if (empty($split[$k]))
    unset($split[$k]);
}
ksort($split);
$join = implode('', $split);
?>

获取完全剥离newlinews的字符串。但它无法正常使用JS :(

答案 5 :(得分:0)

使用正则表达式的系统不可知技术涉及AddVMOption -Xmx1024M转义序列。

PHP Documentation on Escape Sequences

这真的很简单,只需调用\R

\ R-换行符:匹配\ n,\ r和\ r \ n

如果无论如何都要爆炸替换字符,标准化输入都是浪费时间和精力。

如果您担心字符串中包含多个连续的换行符,可以在preg_split('~\R~', $textareaInput)之后添加+量词。

如果要从结果数组的字符串的两侧修剪空格字符,可以使用\R