2012-06-19 82 views
0

我在旧网站上工作并更新弃用的php函数。我有以下代码,当我将ereg更改为preg时会产生错误。将ereg_replace更改为preg_replace时出错

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

你不能只是将“ereg”改为“preg” – 2012-06-19 21:49:41

+0

我明白了,但我得到的说明并没有告诉我还有什么要改变的。这就是我来这里的原因。我试着把它改成'return preg_replace($ pattern,$ replace,addslashes($ string));'但是也有错误。我做错了什么,但我不知道是什么。 – jlg

+0

嗯,''\/\ *。* \ * \ /'si'应该是''\/\ *。*?\ * \ /'si',除此之外.... – Wrikken

回答

1

所以,你的正则表达式如下:

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

一次取一个,你首先贪婪地删除多行注释。这几乎可以肯定你的记忆问题来自哪里,你应该对这个量词不予理解。

接下来,您将发现任何看起来像PHP标签的东西。这是用懒惰的量词完成的,所以我没有看到任何问题。 ASP标签也一样,最后是脚本标签。

除了你的正则表达式遗留的potental XSS威胁,主要问题似乎来自你的第一个正则表达式。改为尝试"'\/\*.*?\*\/'si"

+0

哦,对,@Wrikken告诉我也使用它。在发表评论时我必须摆脱它。 – jlg

+0

这似乎是伎俩!我也接受了第二个函数的评论,并且没有错误。我只希望这个搜索代码没有被破坏,因为现在我知道我的同事会改变它,我觉得我浪费了很多时间来试图找出这个问题。 查看搜索会发生什么,当您将搜索文本框重定向到搜索结果页面时,搜索文本框会重复,所有结果都会被重复,结果会显示26找到,但只会列出3或4,而不会分页,正在通过php文件搜索,而不是像它应该的网站。 – jlg

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指令,搜索资源限制

+0

我回应了'get_memory_usage',它在我的屏幕顶部显示了499504。该错误显示'允许的内存大小10000000字节耗尽(试图分配3124687字节)'。似乎这些数字没有任何意义。如果它真的只有499,504个字节,那么它是如何表示耗尽10,000,000字节的限制? – jlg

+0

10MB适用于您的整个脚本,如果您加载大量数据并通过reg exp进行操作,那么完全有可能重新执行此操作。这几天默认值设置为128MB。尝试设置更多,并看到它有助于。 (它应该,这是什么错误是关于毕竟,没有足够的内存)它是过程的限制,所以你加载的所有东西,所有这些运行,所有你调用的函数.. –

+0

谢谢你的更正:-) –

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; 
} 
+1

所以......只是把这个问题扫到一个地毯下,然后把它留给开发者处理的其他可怜的草皮?尼斯... –

+0

这不是我的想法,另一个程序员过来帮助我,这就是他让我做的。 :/ – jlg

+2

From [Computer Stupidities](http://www.rinkworks.com/stupid/cs_programming.shtml):“当我在学习编程时,我的一位同学在他的程序中遇到了严重的麻烦,当他问我帮助,我俯视他的屏幕,并看到他的所有代码在评论中。原因:“好吧,它编译更快这种方式。”“ –