2013-03-07 60 views
4

我儘量避免提出愚蠢的問題,但是由於某些原因,這只是不起作用。我正在從數據庫中檢索一些文本,幷包含換行符。當使用回聲直線距離,這是輸出:不能用php中的內容替換 n使用數據庫中的內容

=== 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; 
+0

數據庫中'course_content'的變量類型是什麼? – christopher 2013-03-07 17:27:54

+0

這是一個長文本\t與utf8_general_ci 這可能是問題嗎? – MaxQ 2013-03-07 17:31:00

+0

你有沒有試過把它轉換成普通的舊字符串,看看會發生什麼?由於PHP是鬆散類型的,因此有時很難跟蹤移動代碼的類型。 – christopher 2013-03-07 17:31:47

回答

3

當你這樣做:

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

你真的看到打印的輸出\n?還是它實際上打印了一個新的行字符?

如果是前者,那麼你的數據庫字符串中會有一個轉義的換行符,而不是實際的換行符。換句話說,您的數據庫字符串包含兩個字符\n,這不是換行符。

試試這個替換而不是(或除了,是完全安全的):

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

single quotes syntax的字符串導致PHP這兩個人物\n不會變成一個換行符,因此應該實際上匹配數據庫中的內容。 (你也可以使用\\n,其中第一個斜槓轉義第二個斜線,防止它變成一個換行符。)

編輯:要回答你的問題,假設你的意思是mysql_real_escape_string,那麼是的,這是正常現象。從文檔:

mysql_real_escape_string()調用MySQL的庫函數mysql_real_escape_string,其中前添加反斜槓以下字符:\ X00\ n\ r\'\ x1a

+0

Tha恩克斯,它的作品!但這是'正常',還是我在數據庫中做了些腥意?我插入之前使用了real_escape_string。 – MaxQ 2013-03-07 17:42:08

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

如果你想更換\n,你應該尋找使用單引號它 - '\n'(而不是"\n") - 兩個在PHP中有着非常不同的含義。

+0

yes!解決了這個問題。但爲什麼沒有nl2br($ content)做任何事情? – MaxQ 2013-03-07 17:37:03

+0

@Manfred,'nl2br'尋找新的行字符。似乎在你的字符串中有新的行字符 – 2013-03-07 17:45:17

+0

謝謝,它的工作原理!但這是'正常',還是我在數據庫中做了一些可怕的事情?我插入之前使用了real_escape_string – MaxQ 2013-03-07 17:46:14