Preg_Replace和Capture Value? PHP

时间:2010-08-25 16:37:07

标签: php regex preg-replace

我正在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;
}

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

除了preg_replace函数之外,没有真正的循环,所以,我将如何提供该值?

思想?

EDIT(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;

}

2 个答案:

答案 0 :(得分: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有shortcode API管理你的短代码解析,所以你可以集中精力处理你想用短代码属性做什么。

答案 1 :(得分:0)

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

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

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

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

代码:(Demo)

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

附言正如@azureru 在评论中提到的,这似乎是实现 Wordpress 短代码 api 的好选择。 http://codex.wordpress.org/Shortcode_API