1

我正在 Wordpress 中构建一个过滤器插件,并用一些 html 替换一些插件特定的标签。

示例:[VIDEO ID=12]将通过此函数中的 preg_replaced 替换

function display_video($text){
   
   $pattern = '/\[VIDEO ID\=\d+\]/';
   
   $text=preg_replace($pattern,get_video_block($id),$text);
   
   return $text;
}

我不确定如何确保为每次替换事件提供正确的 ( $id) 参数给我的函数。get_video_block()

除了函数内部之外,没有真正的循环在进行preg_replace(),那么我将如何提供该值?

有关更多上下文,请get_video_block()使用以下功能:

function get_video_block($id){
    global $wpdb;
    $wpdb->show_errors();
    $table_name = $wpdb->prefix . "video_manager";
    $query = "SELECT * FROM " . $table_name . " WHERE `index` = '$id'"; 
    $results = $wpdb->get_results($query, ARRAY_A);
    
    $results = $results[0];
    
    $returnString = '<div class="vidBlock">';
        $returnString .= $results['embed_code'];
        
        $returnString .= '<div class="voteBar">';
            $returnString .= $results['vote_text'];
            $returnString .= '<input type="button" value="YES" class="voteButton">';
            $returnString .= '<input type="button" value="NO" class="voteButton">';
        $returnString .= '</div>';
        
        $returnString .= $results['title'] . '<br>';
        $returnString .= $results['description'] . '<br>';
    
    $returnString .= '</div>';
    
    return $returnString;
    
}
4

2 回答 2

4

您可以preg_replace_callback()用于此目的。您还需要用括号括起来\d+,以便可以在回调函数中捕获和使用它。()

function display_video($text) {
    $callback = create_function('$matches', 'return get_video_block($matches[1])');
    return preg_replace_callback('/\[VIDEO ID\=(\d+)\]/', $callback, $text);
}

请注意,$matches[1]使用它是因为$matches[0]包含由正则表达式匹配的整个字符串。

Erwin 的评论可能对您有用 - WordPress 有一个短代码 API可以为您管理短代码解析,因此您可以专注于处理您想要对短代码属性执行的操作。

于 2010-08-25T16:43:19.450 回答
0

@BoltClock 的答案是正确的,但create_function()现在有点过时了。

通过内部的匿名函数将捕获的 id 传递给辅助函数preg_replace_callback()

辅助函数返回的字符串将用于替换整个匹配的短代码。

由于没有为 声明限制preg_replace_callback(),因此可能会进行多次替换。

代码:(演示

function get_video_block($id) {
    return "***replacement text for $id***";
}

function display_video($text) {
   return preg_replace_callback(
              '/\[VIDEO ID=(\d+)]/',
              function($m) {
                  return get_video_block($m[1]);
              },
              $text
          );
}

echo display_video("Here is a video [VIDEO ID=33] to watch");

输出:

Here is a video ***replacement text for 33*** to watch

Ps 正如@azureru 在评论中提到的,这似乎是实现 Wordpress 短代码 api 的一个很好的候选者。http://codex.wordpress.org/Shortcode_API

于 2021-04-30T18:19:47.383 回答