用str_replace忽略断行

时间:2015-03-17 10:30:25

标签: php str-replace line-breaks

以下代码将替换某些文字。实际上,我从$str的文本文件中获取了file_get_contents数据,所以请想象$str中有一个新行。

$str = 'From: My Name <myemail@myname.com>
        To: storm@yahoo.com
        Message-ID: <1638618225.203837.1426581391642.JavaMail.yahoo@mail.yahoo.com>';

$old = array("My Name", "To: storm@yahoo.com");
$new   = array("New Name", "");
echo str_replace($old, $new, $str );

输出:

From: New Name 

Message-ID: <1638618225.203837.1426581391642.JavaMail.yahoo@mail.yahoo.com>

不幸的是,在删除To: storm@yahoo.com后,代码将创建一个换行符。如何在不创建新分隔线的情况下使用str_replace

3 个答案:

答案 0 :(得分:2)

就像你说你从文本文件中得到这个,如果你显示的是文本文件中的内容,那么它不会创建一个换行符,实际上你并没有删除已经存在的新行。

尝试

$str = 'From: My Name <myemail@myname.com>
        To: storm@yahoo.com
        Message-ID: <1638618225.203837.1426581391642.JavaMail.yahoo@mail.yahoo.com>';

$old = array("My Name", "To: storm@yahoo.com\n");
$new = array("New Name", "");

答案 1 :(得分:1)

str_replace不会添加新的换行符;它用您支持的字符串替换字符串,并告诉它用空字符串替换行中的文本。 最简单的方法是在搜索数组中包含换行符:

$old = array("My Name", "To: storm@yahoo.com\n");

答案 2 :(得分:1)

它不会创建新行,只是从str_replace()开始。

因此,如果您想要删除只包含换行符的每一行,您可以使用:

(此处我首先将$old替换为$new,然后用新行字符替换explode()字符串。然后我将array_map()与{{3}结合使用从每一行删除这些字符(["", "\t", "\n", "\r", "\0", "\x0B"])。然后我用trim()删除所有剩余的空行,最后再删除array_filter()字符串)

echo $str = implode(PHP_EOL,
                array_filter(
                    array_map("trim",
                        explode(PHP_EOL, str_replace($old, $new, $str))
                    )
                )
            );