2013-02-11 120 views
1

我以這樣一個字符串開頭:」我想:\ r \ n \ r \ n1。)擺脫這個混亂\ r \ n \ r \ n \ 2。)現在請「(this是'清理'用戶輸入文本)。PHP - 從此字符串中刪除「 r n r n」的問題:「我想: r n r n1。)解決這個問題 r n r n 2。)現在請「

所以基本上我的發言會是這樣:

$query = sanitize($_POST['query']); // gives the result string 

我想從這個字符串中刪除了 「\ r \ n \ r \ n」 的。到目前爲止,我已經嘗試通過這樣做如下:

$query = preg_replace("/\r\n\r\n/", " ", $query); 

$query = str_replace("\r\n\r\n", " ", $query); 

沒有人可以工作嗎?

但是,如果我做到以下幾點:

$query = "I would like to:\r\n\r\n1.) Rid this mess\r\n\r\n\2.) Now Please"; 
$query = preg_replace("/\r\n\r\n/", " ", $query); // I tried str_replace() too 
var_dump($query); 
exit; 

我得到我想要的輸出...

可能有人請爲什麼地球上,這是發生在我解釋如何我可以解決問題?

任何意見,輸入或建議會因爲我不是從拉我的頭髮幾乎光頭不勝感激......

謝謝!

編輯:

這可能會幫助功能的sanitize():

function html($text) 
{ 
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); 
} 

function htmlout($text) 
{ 
    return html($text); 
} 

function cleanInput($input) 
{ 
    $search = array(
     '@<script[^>]*?>.*?</script>@si', // Strip out javascript 
     '@<[\/\!]*?[^<>]*?>@si',   // Strip out HTML tags 
     '@<style[^>]*?>.*?</style>@siU', // Strip style tags properly 
     '@<![\s\S]*?--[ \t\n\r]*>@'   // Strip multi-line comments 
    ); 
    $output = preg_replace($search, '', $input); 
    $output = htmlout($output); 
    return $output; 
} 

function sanitize($input) 
{ 
    if (is_array($input)) 
    { 
     foreach($input as $var=>$val) 
     { 
      $output[$var] = sanitize($val); 
     } 
    } 
    else 
    { 
     include "C:/wamp/www/includes/inc/main/db.inc.php"; 
     if (get_magic_quotes_gpc()) 
     { 
      $input = stripslashes($input); 
     } 
     $input = cleanInput($input); 
     $output = mysqli_real_escape_string($link, $input); 
    } 
    return $output; 
} 
+1

我們是在談論換行或'\ r \ N'文字字符? – 2013-02-11 10:30:37

+0

@ÁlvaroG。Vicario這是從某些用戶輸入文本中刪除換行符的結果。我認爲在這個結果中的翻譯結果是字面字符,因爲這是存儲在我的數據庫中的。我將在第二個帖子中發佈sanitize()代碼... – 2013-02-11 10:34:08

+0

[在PHP中單引號和雙引號字符串之間的區別]可能的重複(http://stackoverflow.com/questions/3446216/difference-between-single-quote - 和 - 雙引號字符串在PHP中) – 2013-02-11 10:36:56

回答

1

唯一正確的解決方案

  1. 擺脫sanitize()功能
  2. 使用準備好的語句來把你的數據到數據庫中。
  3. 使用htmlout()函數顯示用戶的文本。

你可以閱讀更多herehere

+0

我一直使用準備好的陳述,但從來沒有真正考慮過我所做的事情是雙重工作:我想我已經教會了自己一些無關緊要的東西......儘管有時候當文本重新顯示給用戶,例如在「你的輸入:etc ...無效」的錯誤情況下......這將是正確的使用類似的東西嗎?無論如何,我真的很感謝你的回覆,我想我應該把更多的想法付諸實踐! – 2013-02-11 10:55:45

+0

你也有一個傑出的名字!呵呵:) – 2013-02-11 10:56:41

+0

如果用戶有意故意發佈惡意代碼會發生什麼,使用cleanInput()函數而不是僅僅使用htmlout()會更好嗎? – 2013-02-11 11:06:29

0

如果有文字在你的數據庫\r\n字符,則需要翻兩番的斜線。

所以,你使用這個理論上應該做的伎倆:

$query = preg_replace("/\\\\r\\\\n\\\\r\\\\n", " ", $query); 
+0

好吧,我想我現在明白了...在我的數據庫中,它被存儲在「\ r \ n \ r \ n」,這是文本一旦被「清理」後的確切輸出...所以,你「我說我應該逃避斜線? B.T.W.不是試圖成爲一個堅持者,但你錯過了/ /我會試一試併發布結果,非常感謝! – 2013-02-11 10:44:38

+0

您需要四個斜線,因爲您使用了兩個上下文,其中'\ r \ n'具有特殊含義:雙引號字符串和正則表達式。你並不需要這裏的任何一個。 – 2013-02-11 10:51:29

0

這爲我工作

$string = preg_replace("/\\\\r\\\\n\\\\r\\\\n/", "", $string);