【问题标题】:PHP: call-time pass-by-reference broke my array_walk and I can't fix itPHP:调用时传递引用破坏了我的array_walk,我无法修复它
【发布时间】:2013-12-06 06:32:37
【问题描述】:

这是引入弃用错误之前的 PHP 代码:

array_walk( $tags, 'shortcode_tag_parse', &$content );

function shortcode_tag_parse( &$tag, $key, &$content ) {

    $content = preg_replace_callback( "{\[{$tag}[^\]]*\].*?\[/{$tag}\]}is", 'shortcode_img_unautop', $content );

}

// Replace <p> tags around images
function shortcode_img_unautop( $match ) {

    return preg_replace( '#\s*<p>\s*(<a .*>)?\s*(<img .*>)\s*(<\/a>)?\s*<\/p>\s*#iU', '\1\2\3', $match[0] );

}

现在,如果我删除通话时间参考:

array_walk( $tags, 'shortcode_tag_parse', $content );

它不再修改 $content,我绝对需要这样做。我不会满足于切换到循环。我看过的其他主题只是说删除调用时引用&amp;,当我这样做时,它不再做它应该做的事情。

有谁知道我怎样才能让我的代码再次工作,而不需要循环(array_walk 和 array_map 对我来说看起来更好)。

【问题讨论】:

  • 你可以用你自己的定义实现你自己的array_walk版本。
  • 看起来你正在实现一个 BBCode 解析器。这是一个已解决的问题,如果可以的话,可能应该使用第三方库代码,而不是自己动手。
  • @Charles 这不是解析 BBCODE,它只是剥离在 bbcode/shortcode 之间的图像周围发现的

    标签。 WordPress 的内置解析器仍在使用中。 $tags 来自它使用的 WordPress 自己的短代码正则表达式,所以我知道它们存在并且有正确的结束标签。

标签: php pass-by-reference preg-replace-callback


【解决方案1】:

正如 cmets 中所述,您最好的选择是重新实现 array_walk,它希望最后一个参数作为参考。对内置函数的调用时传递引用是危险的,并且在一些相当严重的安全漏洞之后基本上被普遍删除。

这是一个完全未经测试的示例。

function array_walk_userdata_by_ref(array &$array, $callback, &$userdata = null) {
    foreach($array as $k => $v) {
        $array[$k] = $callback( $v, $k, $userdata );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2013-11-27
    • 2019-01-15
    • 2020-09-16
    相关资源
    最近更新 更多