PHP检测文本字段中的换行符


PHP detecting line breaks in text field

我正在尝试拆分文本表单字段的POST数据。我希望使用explode()函数将数据按每行分割

因此,首先我检查POST结果中是否有奇怪的字符;

$mails = mysql_real_escape_string($_POST["emails"]);

然后我运行这个,它不工作

$emails = explode("'r'n", $mails);

我做错了什么?不是吗''r''n?我的sql escape有点搞砸我了吗?

您还可以将新行转换为换行符,然后从<br /> s:中分解

$mails = mysql_real_escape_string(nl2br($_POST["emails"]));
$emails = explode("<br />", $mails);

因此,首先我检查POST结果中是否有奇怪的字符;

$mails = mysql_real_escape_string($_POST["emails"]);

这里有一些消息:不,你没有。你只是做了一些的事情,却不明白自己做了什么。这只是在做奇怪的事情而不是检查一些奇怪的事情。

然后需要在所使用的行分隔符字符上进行分解。看起来不是"'r'n",下一次尝试是"'n""'r"

$emails = preg_split("/'R/u", $_POST["emails"], -1, PREG_SPLIT_NO_EMPTY);

(假设您有UTF-8输入)

试试这样的东西:

function guessLineEndings( $aString ) {
  assert( is_string( $aString ));
  if ( FALSE !== strpos( $aString, "'r'n" )) {
     return 1;
  } else if ( FALSE !== strpos( $aString, "'n" )) {
     return 2;
  } else if ( FALSE !== strpos( $aString, "'r" )) {
     return 3;
  } else {
     return -1;
  }
}

请注意,如果输入是单行,则不能猜测一行的结尾。

如果您运行动态SQL查询,请不要忘记这一点:

永远不要使用例如mysql_real_eescape_string()来进行转义!始终使用事先准备好的语句!

请查看OWASP的PHP安全备忘单,了解这一点:逃跑不安全