5

我尽量避免问愚蠢的问题,但由于某种原因,这不起作用。我正在从数据库中检索一些文本,其中包括换行符。直接使用 echo 时,输出如下:

=== BOLD TEXT ===\nHere is some text.

这就是我检索它的方式:

$row = $query->row();
$content=$row->course_content;

以下都没有任何效果......

$content= str_replace(array("\r\n", "\r", "\n"), "<br />", $content); 
$content= str_replace("\n", " ", $content);
$content = nl2br($content);

但是,当我将其硬编码为原始语句的字符串时,

$content="=== BOLD TEXT ===\nHere is some text.";

砰!它可以工作......关于它为什么拒绝接受数据库输入的任何想法,但手动字符串很好?

完整代码:

//Switch between these two:
$row = $query->row();
$content=$row->course_content;
$content="=== BOLD TEXT ===\nHere is some text.";
$content = str_replace(array("\r\n", "\r", "\n"), "<br />", $content); 
$content = str_replace("\n", " ", $content);
$content = nl2br($content);     
echo $content;
4

2 回答 2

4

当你这样做时:

$row = $query->row();
$content=$row->course_content;
echo $content;

你真的看到\n打印到输出了吗?还是它实际上打印了一个换行符?

如果是前者,那么您的数据库字符串中有一个转义的换行符,而不是实际的换行符。换句话说,您的数据库字符串包含两个字符\n,这不是换行符。

试试这个替代品(或除此之外,为了完全安全):

$content = str_replace(array('\r\n', '\r', '\n'), "<br />", $content); 

字符串的单引号语法导致 php 不会将这两个字符转换为换行符,因此它实际上应该与数据库中的内容相匹配\n(您也可以使用\\n,第一个斜杠转义第二个斜杠,防止它变成换行符。)

编辑:要回答您的问题,假设您的意思是mysql_real_escape_string,那么是的,这是预期的行为。从文档中:

mysql_real_escape_string()调用 MySQL 的库函数 mysql_real_escape_string,它在以下字符前面加上反斜杠:\x00\n\r\ 、 '"\x1a

于 2013-03-07T17:35:59.167 回答
3
$content="=== BOLD TEXT ===\nHere is some text.";

如果你想替换\n,你应该使用单引号搜索它 - '\n'(而不是"\n") - 两者在 PHP 中具有非常不同的含义。

于 2013-03-07T17:32:18.167 回答