带有#U的php preg_replace似乎将带有特殊字符的字符串转换为空字符串

时间:2012-06-23 15:34:57

标签: php

我几个小时以来一直在研究这个问题,并将其缩小到这几行代码。我知道代码并不完美,但这是我与开发人员合作的内容。该脚本应该过滤掉潜在的恶意代码。但问题是,只要有人使用特殊字符,例如á,ñ,ö等,字符串就会变空。

例如,如果有人写“vivaespaña”,则字符串变空。

如果有人写“viva espana”(没有ñ),那一切都很好。

其他特殊字符也是如此。可能是什么导致了这个?我几乎没有关于正则表达式的知识,所以它对我来说有点像垃圾,但我所知道的是,当我注释掉这些行时,脚本可以使用和不使用字符串中的特殊字符以及我取消注释的那一刻它们只能在字符串中没有特殊字符的情况下工作。

有什么想法吗?

这些是代码行:

  $string = preg_replace('#(&\#*\w+)[\x00-\x20]+;#u', "$1;", $string);
  $string = preg_replace('#(&\#x*)([0-9A-F]+);*#iu', "$1$2;", $string);
  $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])(on|xmlns)[^>]*>#iUu', "$1>", $string);

  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2nojavascript...', $string);
  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2novbscript...', $string);
  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*-moz-binding[\x00-\x20]*:#Uu', '$1=$2nomozbinding...', $string);
  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*data[\x00-\x20]*:#Uu', '$1=$2nodata...', $string);

  $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])style[^>]*>#iUu', "$1>", $string);

1 个答案:

答案 0 :(得分:0)

我建议不要使用u。该标志指定该字符串是Unicode格式,但您只能使用ASCII范围内的字符串。