preg_match和ereg有什么区别?

时间:2016-02-20 01:05:24

标签: php regex

我有一个获取php_info()并运行

的php页面
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 个答案:

答案 0 :(得分:1)

您可以通过添加s modifier(允许点元字符匹配换行符)来调整正则表达式,如下所示:

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

这会让你得到$regs[0]的输出,并且应该尽可能快地使用正则表达式 - 显然这里没有太大的改进余地。

如果一个正则表达式仍然太慢,那么更高效的选项就是使用strpos / strrpos / substr进行简单的旧字符串操作。

答案 1 :(得分: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);
    }
?>