【问题标题】:'Undefined offset' after converting preg_replace to preg_replace_callback将 preg_replace 转换为 preg_replace_callback 后的“未定义偏移量”
【发布时间】:2015-05-09 12:40:00
【问题描述】:

感谢this post 中的信息,我已经成功地将我需要更新的大部分 preg_replace 语句转换为 preg_replace_callback 语句。

但是,当我转换以下语句时:

$body_highlighted = preg_replace('/((<[^>]*)|' . preg_quote(strtr($query, array('\'' => '&#039;')), '/') . ')/ie' . ($context['utf8'] ? 'u' : ''), 
    "'\$2' == '\$1' ? stripslashes('\$1') : '<strong class=\"highlight\">\$1</strong>'", 
        $body_highlighted);

$body_highlighted = preg_replace_callback('/((<[^>]*)|' . preg_quote(strtr($query, array('\'' => '&#039;')), '/') . ')/i' . ($context['utf8'] ? 'u' : ''), 
    function ($matches) {
        return $matches[2] == $matches[1] ? stripslashes($matches[1]) : "<strong class=highlight>$matches[1]</strong>";
    }, 
      $body_highlighted);

出现错误信息'Undefined offset: 2'(原来的preg_replace语句不会产生这个错误)。

我花了几个小时试图解决这个问题,但由于我以前从未做过 PHP 编程,我真的不知道为什么它不起作用或如何解决它。

【问题讨论】:

    标签: php preg-replace preg-replace-callback


    【解决方案1】:

    您的模式包含一个交替。在此交替的第一个分支中,定义了组 2,但在第二个分支中不是这样。因此,如果第二个分支成功,则未定义捕获组 2(如 $matches[2]

    要解决这个问题,你只需要用isset()测试$matches[2]是否存在

    但是,如果您删除包含所有模式的无用捕获组,则可以以更简单的方式编写:

    $pattern = '/(<[^>]*)|' . preg_quote(str_replace("'", '&#039;', $query), '/')
             . '/i' . ($context['utf8'] ? 'u' : '');
    
    $body_highlighted = preg_replace_callback($pattern, function ($m) {
        return isset($m[1]) ? stripslashes($m[0])
                            : '<strong class="highlight">' . $m[0] . '</strong>';
    }, $body_highlighted);
    

    【讨论】:

    • 我想我可能需要使用isset(),但我不知道如何/在哪里把它放在这个声明中。
    • 非常好 - 非常感谢! (只需将 $query))) 更改为 $query)) 即可使其正常工作。
    • @GL700Wing:确实,我没见过。
    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多