【问题标题】:A maximum character limit on the preg functions?preg 函数的最大字符数限制?
【发布时间】:2010-05-25 06:11:23
【问题描述】:

在我的网站上,我使用输出缓冲来获取所有输出,然后在将其发送到浏览器之前通过进程函数运行它(我不替换任何东西,只是将其分解成更易于管理的部分)。在这种特殊情况下,输出量很大,因为它为数据库中的每个国家(大约 240 个国家)列出了一个标签。问题是,我的 preg_match 函数似乎被跳过了,它什么也不做,也不返回任何匹配项。但是,如果我删除部分标签(没有特定部分,只是随机部分以减少字符),那么 preg_match 函数将再次起作用。我从标签中删除什么似乎并不重要,似乎只要我删除了这么多字符。 preg 函数可以处理的内容是否有某种上限,或者如果要扫描的数据太多,它会超时吗?

编辑:这是它所运行的函数。

public function boom($data) {
    $number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER);
    if ($number == 0) $data = array("content" => $data);
    else unset($data);
    foreach ($matches as $item):
        //$item[3] = preg_replace("/\n/", "", $item[3], 1);
        if (preg_match("/<!-- breaker -->/s", $item[3])) $data[$item[2]] = explode("<!-- breaker -->", $item[3]);
        else $data[$item[2]] = $item[3];
    endforeach;
    //die(var_dump($data));
    return $data;
}

这是发送到页面的未处理输出。我已经确定是开头的 preg_match_all 在变量中返回 0 个匹配项,因此该函数只是将接收到的整个字符串扔到 $data['content'] 中并跳过其他所有内容。

http://pastebin.com/iGfM6gxx

我尝试将标签放在新行上,将它们折叠在一起,但似乎没有任何效果。但是如上所述,如果我删除它的随机部分,那么它会很好。该功能适用​​于正常长度的其他所有页面。

【问题讨论】:

    标签: php pattern-matching limit preg-match


    【解决方案1】:

    没有看到你的正则表达式和数据很难说,但尝试更改 pcre.backtrack_limit / pcre.recursion_limit (http://www.php.net/manual/en/pcre.configuration.php)

    【讨论】:

    • 我测试过,它对我很有用(php 5.3)。但是,无论如何,尝试使用 "/()\n? | \n?()/s " 代替。
    • 好吧,我想这只是一个谜,为什么它不适合我。感谢您的修改。我找到了一个简单的解决方法,实际上我已经在系统中实现了它,因此我不需要任何额外的编码。我只是将这两个单独的部分手动存储到数组中,就像它已经被处理过一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多