preg_match():编译失败:更新后的范围无效

时间:2014-08-19 19:41:31

标签: php compilation preg-match

我有一个没有问题的脚本,直到我升级到php和mysql,现在当我使用脚本的导入部分时,我收到此错误

遇到PHP错误 严重性:警告 消息:preg_match():编译失败:偏移量为7的字符类中的无效范围 文件名:libraries / Upload.php 行号:2685

在第2685行的文件部分,我有第2282到2691行的代码

if (!empty($mime_from_browser) && !$this->file_src_mime || !is_string($this->file_src_mime) || empty($this->file_src_mime)) {
            $this->file_src_mime =$mime_from_browser;
            $this->log .= '- MIME type detected as ' . $this->file_src_mime . ' by browser<br />';
            if (preg_match("/^([\.-\w]+)\/([\.-\w]+)(.*)$/i", $this->file_src_mime)) {
                $this->file_src_mime = preg_replace("/^([\.-\w]+)\/([\.-\w]+)(.*)$/i", '$1/$2', $this->file_src_mime);
                $this->log .= '-&nbsp;MIME validated as ' . $this->file_src_mime . '<br />';
            } else {
                $this->file_src_mime = null;
            }
        }
问题在哪里?在过去的两个月内没有对脚本进行任何更改。

由于

1 个答案:

答案 0 :(得分:5)

当前preg_match_all模式将始终失败。之前没有显示错误。升级PHP时,错误报告/错误显示已更改。

短划线-字符表示a-z之类的范围,表示从az的所有字符。要将短划线用作破折号,它必须是角色类[]中的第一个或最后一个,或者需要转义\-

"/^([\.\w-]+)\/([\.\w-]+)(.*)$/i"

"/^([-\.\w]+)\/([-\.\w]+)(.*)$/i"

"/^([\.\-\w]+)\/([\.\-\w]+)(.*)$/i"

您目前使用它的方式意味着.word character的范围没有任何意义,也不是有效范围。