输出过程中的PHP“退格”字符可能吗?

PHP "backspace" character during output possible?

提问人:Jeff 提问时间:9/18/2009 更新时间:11/23/2013 访问量:32374

问:

我有一种感觉,答案是“这是不可能的”,但我想我会要求满足我的好奇心。

我有一些代码在\n不可避免的地方被回显:

echo "Hello \n";
echo "World!";

我希望该行简单地读取(在代码输出中):

世界您好!

...从而删除 \n.

所以我想知道是否可以在PHP的输出中执行“退格”字符?

像这样简单的东西str_replace( "\n", 'backspace-character', $str );

PHP的

评论


答:

1赞 Pascal MARTIN 9/18/2009 #1

只是用空格替换“”(或者什么都不用,如果你的传入字符串中已经有一个空格)怎么样?\n

像这样,例如:

$str = "Hello\nWorld!";
var_dump($str);

$str = str_replace("\n", ' ', $str);
var_dump($str);

第一个输出给出:

string 'Hello
World!' (length=12)

第二个:

string 'HelloWorld!' (length=11)

这还不够吗?
(或者也许我不太理解这个问题)

1赞 p4bl0 9/18/2009 #2

你不能这样做吗:

$str = str_replace("\n", ' ', $str);
while (strpos($str, '  ') !== false) // while there's two spaces in a row
  $str = str_replace('  ', ' ', $str);

现在,每个空格或字符序列将仅替换为一个空格。 (因为如果你只是删除\n,你可能会有一些地方缺少一个空格,如果你只是用一个空格替换它,你就会有一些地方连续有多个空格)。$str\n

编辑:我不知道循环是否真的有必要,但我在这里没有什么可以测试的,如果会自动做这个伎俩(而且我不认为将正则表达式用于如此简单的事情真的是一个好主意)。str_replace

评论

0赞 Jeff 9/18/2009
我上面的例子很粗糙,但\n是不可避免的。
0赞 Agi Hammerthief 2/9/2014
出于什么原因,您认为使用正则表达式不是一个好主意?如果性能是一个问题,那么您的循环肯定是一个潜在的问题,或者我是否遗漏了什么?
3赞 Yacoby 9/18/2009 #3

如果你想做任何事情,你可以使用输出缓冲区:

ob_start();

echo "Hello\n World";

$out = ob_get_contents();

ob_end_clear();
echo str_replace('\n', '', $out);

您甚至可以使用 httaccess 将包含此内容的脚本附加到任何调用的脚本中。

但是,您不能在将其设置为 stdout 之前处理它吗?喜欢

function print2($str){
    echo str_replace("\n", '', $str);
}

评论

1赞 MrMesees 9/24/2016
你是说偶然吗?ob_end_clean();
35赞 Brenton Alker 9/18/2009 #4

是的,退格字符是 ASCII 字符代码 8(根据 ASCII 表),因此您可以使用 chr() 在 php 中输出它。例如:

echo 'ab' . chr(8);

将输出“a”

评论

7赞 Brenton Alker 9/18/2009
在浏览器中?我只在命令行上测试了它,在我认为没有的浏览器中退格键真的没有意义。
0赞 Jeff 9/18/2009
使用 FF 查看源查看网页的源时。
6赞 Brenton Alker 9/18/2009
好的,如果你说的是 CLI 以外的任何东西,你可能不想要一个字面上的退格字符。其他建议的解决方案可能更有用。
1赞 Jaime Bellmyer 4/7/2011
感谢您对这个问题的直截了当的回答 - 这正是我正在寻找的:)
0赞 jbo5112 5/31/2013
在命令行上重定向到文件时,这不起作用。我遇到了与网络资源相同的问题。
6赞 Peter Bailey 9/18/2009 #5

如果输出目标是 HTML,那么额外的空格就无关紧要了 - 浏览器不会呈现多个连续的空间(这就是我们有 )

如果输出目标是其他内容,则只需清理输出即可。从其他回复中可以看出,有无数种方法可以做到这一点。似乎您正在使用 echo 语句,因此输出缓冲函数将是您想要采用的路线。

ob_start();

echo "Hello \n";
echo "World!";

$output = preg_replace( "/ +/", ' ', str_replace( "\n", ' ', ob_get_clean() ) );

echo $output;
0赞 Alex Weinstein 9/18/2009 #6

与其考虑如何做退格字符,我建议重新思考这个问题。为什么要收回部分输出?可能是因为你输出得太早了。

不要对中间值进行回显,而是将它们追加到缓冲区。然后编辑缓冲区。然后打印出来。如果您无法控制是否生成输出(例如,您正在使用输出内容的外部供应商库),请使用 PHP 输出缓冲。

-6赞 dvance12 2/18/2013 #7

我不知道如何做退格键,但如果你只是想做一个新行,我会使用:

echo "<br>";

PHP 代码允许使用 html 代码,只要它在 print 或 echo 语句中使用并且位于双引号内。

3赞 Brian 11/23/2013 #8

这不是对他的确切问题的直接回答,而是标题似乎暗示的内容:输出 PHP“退格”字符,这可能仅在使用 PHP CLI 时才有用。

您可以在 ASCII 表上找到此字符(和其他字符)的正确 ASCII 代码,然后使用 chr() 或转义序列:

echo chr(8);
echo "\010";