忽略带有 str_replace 的换行符

Ignore break line with str_replace

下面的代码将替换某些文本。实际上我从一个文本文件中获取 $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

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

尝试

$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", "");

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

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

它不会创建一个新行,它只是从您的 str_replace().

中留下的

所以如果你想删除每一行只包含换行符的行,你可以使用这个:

(这里我先把$old替换成$new,然后再explode() the string by new line characters. Then I use array_map() combined with trim() to remove these characters (["", "\t", "\n", "\r", "[=17=]", "\x0B"]) from every line. Then I remove all remaining empty lines with array_filter() and at the end I implode()这个字符串)

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