我通过api获取文本,有时文本可能如此:
hello
world!
How are you?
但我确实需要这样的文字:
hello world! How are you?
怎么做?
答案 0 :(得分:1)
您可以通过执行以下操作替换文本中的换行符:
$newmsg = str_replace("\n",' ',$yourmsg);
以下是php函数文档的链接: http://php.net/manual/en/function.str-replace.php
编辑:我在代码中添加了一个空格,因此它确实“hello world ...”而不是“helloworld”
答案 1 :(得分:0)
使用
$str=" test
hello
world" ;
str_replace ( "\n"," " , $str
);
如果你想要更换计数的次数通过第四个参数
str_replace ( "\n"," " , $str , $count ) ;
答案 2 :(得分:0)
$str=<<<EOF
hello
world!
How are you?
EOF;
$s = explode("\n",$str);
print_r(implode(" ",$s));
答案 3 :(得分:0)
这是一个非常荒谬的解决方案,我可能会使用(请记住,ocdcoder的答案工作得很好),以确保我考虑到所有可能的行结尾:
$line_ends = array("\r\n", "\r", "\n"); //notice the order is important.
$new_msg = str_replace($line_ends, " ", $orig_msg);
这样,如果有双线结束,它会摆脱它们,但如果没有,它会返回并检查单行结尾。
但是如果你想变得更复杂,你可以用行尾替换你可能的回车:
$msg_newline_fix = str_replace("\r", "\n", $orig_message);
$msg_double_newline_fix = str_replace("\n\n", "\n", $msg_newline_fix);
$newmsg = str_replace("\n", " ", $msg_double_newline_fix);
但同样,我有点古怪。另一个疯狂的解决方案可能是:
$msg_newline_fix = str_replace("\r", "\n", $orig_message);
$msg_array_lines = explode("\n", $msg_newline_fix);
foreach($msg_array_lines as $msg_line){
$clean_line = rtrim($msg_line);
if($clean_line !== '') {
$msg_clean_array[] = $clean_line;
}
}
$new_msg = implode(" ", $msg_clean_array);
但是如果你知道你的行结尾将是新行(\n
)而不是回车符(\r
)那么你可以安全地使用简单的一行str_replace。
最后,您可能实际上希望在指示新段落时保留行结尾,例如:
Hello
World!
This is a
new paragraph.
在这种情况下,我建议首先对行结尾进行标准化(使它始终保持相同,以便我们不要猜测),然后用某种安全标记替换那些空行,您可以返回并替换为新队。类似的东西:
$msg_carriage_fix = str_replace("\r", "\n\n", $orig_message);
$msg_double_carriage_fix = str_replace("\n\n\n", "\n\n", $msg_newline_fix);
现在我们知道每一行(包括空行)最后只有一个\n
。通过用两个\r
替换潜在的\n
,然后用两个\n
替换一行中只有三个\n
,我们可以避免删除任何行结尾的风险,如果没有首先回车\r
。然后我们终于可以做到:
$msg_hold_true_linebreaks = str_replace("\n\n", "%line-break%", $msg_double_carriage_fix);
$msg_strip_new_lines = str_replace("\n"," ",$msg_hold_true_linebreaks);
最后但并非最不重要:
$new_msg = str_replace("%line-break%","\n",$msg_strip_new_lines);
但是,只有当你真的想要保留那些真正的换行符时,如果你想更加确定你已准备好回车,换行和可怕的\r\n
。
我会展示另一个可能更短的版本并涉及使用内爆和爆炸,但我相信现在已经足够了。
这是最后一个建议的一个稍微简单的版本,它试图考虑行结尾和故意换行:
$msg_rn_fix = str_replace("\r\n", "\n", $orig_msg);
$msg_r_fix = str_replace("\r", "\n", $msg_rn_fix);
我们现在知道每一行都以一个\n
结尾,包括空行......
$msg_array = explode("\n", $msg_r_fix);
普通行每个都得到一个数组值,但我们也知道如果数组值没有,那是故意的强烈回报...
foreach($msg_array as $msg_line) {
$clean_msg_lines[] = ($msg_line == '') ? "\n" : $msg_line;
}
then we put it all back together:
$new_msg = implode(" ", $clean_msg_lines);
唯一的缺陷是每一行结束前后都会有一个额外的空间。这很容易解决:
$new_msg = str_replace(" \n ", "\n", $new_msg);
我非常喜欢这个最后的解决方案,我将在没有评论的情况下将其复制到下面。
$msg_rn_fix = str_replace("\r\n", "\n", $orig_msg);
$msg_r_fix = str_replace("\r", "\n", $msg_rn_fix);
$msg_array = explode("\n", $msg_r_fix);
foreach($msg_array as $msg_line) {
$clean_msg_lines[] = ($msg_line == '') ? "\n" : $msg_line;
}
$new_msg = implode(" ", $clean_msg_lines);
$new_msg = str_replace(" \n ", "\n", $new_msg);