我正在处理旧网站并更新已弃用的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
中更改该行代码中的其他内容吗?
答案 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;
}