将ereg_replace更改为preg_replace时出错

时间:2012-06-19 21:43:10

标签: php preg-replace ereg ereg-replace

我正在处理旧网站并更新已弃用的php函数。我有以下代码,当我将ereg更改为preg时会产生错误。

private function stripScriptTags($string) {
    $pattern = array("'\/\*.*\*\/'si", "'<\?.*?\?>'si", "'<%.*?%>'si", "'<script[^>]*?>.*?</script>'si");
    $replace = array("", "", "", "");
    return ereg_replace($pattern, $replace, $string);
}

这是我得到的错误:

Fatal error: Allowed memory size of 10000000 bytes exhausted (tried to allocate 6249373 bytes) in C:\Inetpub\qcppos.com\library\vSearch.php on line 403

我需要在ereg_replace中更改该行代码中的其他内容吗?

3 个答案:

答案 0 :(得分:1)

所以你的正则表达如下:

"'\/\*.*\*\/'si"
"'<\?.*?\?>'si"
"'<%.*?%>'si"
"'<script[^>]*?>.*?</script>'si"

一次采取这一个,你首先贪婪地剥离多行评论。这几乎肯定是你的记忆问题来自你,你应该不同意量词。

接下来,你要点出任何看起来像PHP标签的东西。这是通过一个惰性量词来完成的,所以我没有看到任何问题。 ASP标签也是如此,最后是脚本标签。

不考虑你的正则表达式遗漏的潜在XSS威胁,主要问题似乎来自你的第一个正则表达式。请改为"'\/\*.*?\*\/'si"

答案 1 :(得分:0)

获取内存限制值

 ini_get('memory_limit');

并使用memory_get_usage()memory_get_peak_usage()检查您的脚本  (这个需要php 5.2或更高版本) 如果结果太低,你可以用以下方法将其设置得更高:

 ini_set("memory_limit","128M"); // "8M" before PHP 5.2.0, "16M" in PHP 5.2.0, > "128M"

只要放入你拥有的任何内存并为你的脚本工作。请记住,这限制了单个php进程;要在全局设置它,你需要调整你的php.ini文件。 显然,如果它需要疯狂的运行量,那么将其视为monkeypatch并开始重写它以获得更好的内存占用。

了解更多信息,请查看core php.ini指令,搜索资源限制

答案 2 :(得分:0)

由于允许更高的内存分配不起作用,以下功能更新如下(因为它们实际上并没有做任何事情而是导致问题):

 private function stripScriptTags($string) 
{
/* $pattern = array("'\/\*.*\*\/'si", "'<\?.*?\?>'si", "'<%.*?%>'si",
   "'<script[^>]*?>.*?</script>'si");
   $replace = array("", "", "", "");
   return ereg_replace($pattern, $replace, $string);
*/
   return $string;
}

private function clearSpaces($string, $clear_enters = true)
{
/*$pattern = ($clear_enters == true) ? ("/\s+/") : ("/[ \t]+/");
  return preg_replace($pattern, " ", trim($string));
*/
  return $string;
}