【问题标题】:Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 1警告:preg_replace() [function.preg-replace]:编译失败:在偏移量 1 处没有可重复的内容
【发布时间】:2012-09-04 15:08:22
【问题描述】:

有人可以帮助调试这个错误吗?

警告:preg_replace() [function.preg-replace]:编译失败: 在偏移量 1 处没有可重复的内容

//Generate uid
    function gen_uid($len=40) {
        $hex = md5("what" . uniqid("", true));
        $pack = pack('H*', $hex);
        $tmp =  base64_encode($pack);
        $uid = preg_replace("#(*UTF8)[^A-Za-z0-9]#", "", $tmp);
        $len = max(4, min(128, $len));
        while (strlen($uid) < $len)
            $uid .= gen_uid(22);
        return substr($uid, 0, $len);
    }

这是什么原因造成的?是 PHP 问题还是其他问题?该应用程序在我的本地机器上运行良好,但在服务器上却不行。

【问题讨论】:

  • 在您的本地计算机上看起来“工作正常”的事实令人担忧。请在您的本地计算机中也启用警告并调查它为什么会工作,因为它应该由于答案中提到的原因而失败。
  • @eis,我当地的坚持没有显示任何警告或错误。
  • 你应该启用它们,这样它会......
  • @eis,我用 ini_set('display_errors','On'); error_reporting(E_ALL);
  • 我想通了,它与使用不同正则表达式编译器的服务器上的 PHP 有关。

标签: php regex preg-replace


【解决方案1】:

* 在正则表达式中表示匹配前一个字符 0 次或多次,而 ( 启动捕获组。因此,* 没有什么可重复的,因为在 * 之前的是 (,它不能自行重复,因此会出现此警告。

要修复它,只需转义 *,如下所示:

$uid = preg_replace("#(\*UTF8)[^A-Za-z0-9]#", "", $tmp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2011-12-29
    • 2020-01-12
    • 2022-11-22
    相关资源
    最近更新 更多