2016-02-20 49 views
0

我有一个PHP页面,得到php_info()和运行preg_match和ereg有什么区别?

ereg('<body>(.*)</body>', $phpinfo, $regs); 

这工作得很好,但因为其弃用我继续更新,以preg_match,它看起来像这样

preg_match('/<body>((?:.|\n)*)<\/body>/', $phpinfo, $regs); 

但现在它每次运行时都会重载服务器。它适用于regexr.com,所以它不应该是错的。 eregpreg_match匹配有什么区别,以及如何在不炸毁服务器的情况下实现此目标?

我想要做的是有一个服务器页面,显示php_info,但与我的正常菜单和样式。任何替代品也将不胜感激。尽管远离iframe。

感谢

PS:Regexr说,与之匹配的是105563个字符长

+2

有没有考虑过使用[DOM文档(http://php.net/manual/en/相反,class.domdocument.php)?更少的开销和更高的精度。 – Machavity

+0

这听起来像是一个不错的选择。我有 $ doc = new DOMDocument(); \t \t \t $ doc-> loadHTML($ phpinfo); \t \t \t $ temp = $ doc-> getElementsByTagName('body'); \t \t \t的foreach($温度为$体){ \t \t \t \t回声$体佩>的nodeValue,PHP_EOL; \t \t \t} 但它只是倾销内容从标签没有html格式。也尝试了saveHTML,但也没有运气。什么是保持所有标签的正确输出方式? –

+0

不要尝试在评论中放置代码。编辑你的问题。 –

回答

1

您可以通过添加smodifier(允许点元字符匹配换行符),作为调整正则表达式:

preg_match('/<body>.*<\/body>/s', $phpinfo, $regs); 

这会让你输出$regs[0],并且对于正则表达式应该尽可能快 - 显然这里没有太多的改进空间。

如果正则表达式仍然太慢,那么一个更高性能的选项将是普通的旧字符串操作,使用strpos/strrpos/substr

+0

工作就像一个魅力:) –

1

由于Machavity建议您可能需要尝试将phpinfo内容解析为DOM。你可以找到一个完整的例子HERE,但是这是一个简化的数据转储,你可以工作了,因为你需要:

<?php 
    ob_start(); 
    $exts = get_loaded_extensions(); 
    phpinfo(); 
    $phpinfo = ob_get_contents(); 
    ob_end_clean(); 
    //print_r($phpinfo); 
    $html_str = $phpinfo; 
    $html = new DOMDocument(); 
    $html->loadHTML($html_str); 
    $html->preserveWhiteSpace = false; 
    $td = $html->getElementsByTagName('td'); 
    echo "<pre>"; 
    foreach ($td as $value) { 
     print_r($value); 
    } 
?> 
+0

这个问题是,它剥离标签,我想保持原始格式 –