'Undefined offset' 在将 preg_replace 转换为 preg_replace_callback 之后
'Undefined offset' after converting preg_replace to preg_replace_callback
感谢 this post 中的信息,我已经成功地将我需要更新的大部分 preg_replace 语句转换为 preg_replace_callback 语句。
但是,当我转换以下语句时:
$body_highlighted = preg_replace('/((<[^>]*)|' . preg_quote(strtr($query, array('\'' => ''')), '/') . ')/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('\'' => ''')), '/') . ')/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 编程,所以我真的不知道为什么它不起作用或如何解决它。
您的模式包含交替。在此交替的第一个分支中,组 2 已定义,但在第二个分支中并非如此。因此,如果第二个分支成功,则未定义捕获组 2(如 $matches[2]
)
解决问题只需要测试$matches[2]
和isset()
是否存在
但是如果你删除包含所有模式的无用捕获组,你可以用更简单的方式写这个:
$pattern = '/(<[^>]*)|' . preg_quote(str_replace("'", ''', $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);
感谢 this post 中的信息,我已经成功地将我需要更新的大部分 preg_replace 语句转换为 preg_replace_callback 语句。
但是,当我转换以下语句时:
$body_highlighted = preg_replace('/((<[^>]*)|' . preg_quote(strtr($query, array('\'' => ''')), '/') . ')/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('\'' => ''')), '/') . ')/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 编程,所以我真的不知道为什么它不起作用或如何解决它。
您的模式包含交替。在此交替的第一个分支中,组 2 已定义,但在第二个分支中并非如此。因此,如果第二个分支成功,则未定义捕获组 2(如 $matches[2]
)
解决问题只需要测试$matches[2]
和isset()
但是如果你删除包含所有模式的无用捕获组,你可以用更简单的方式写这个:
$pattern = '/(<[^>]*)|' . preg_quote(str_replace("'", ''', $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);