2013-02-11 121 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);