格式化通过api接收的文本

时间:2010-03-09 03:47:06

标签: php

我通过api获取文本,有时文本可能如此:

hello
world!
How are you?

但我确实需要这样的文字:

hello world! How are you?

怎么做?

4 个答案:

答案 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);