PHP在foreach中返回preg_replace()?

时间:2011-02-19 20:33:41

标签: php loops preg-replace preg-match-all

哎, 我不知道我做错了什么。 我有一个regexp模式,可以查找内部的youtube网址或[track = url]。

如果正则表达式匹配,我将返回一个youtube嵌入代码。我需要为每个视频都有一个唯一的ID。我在preg_match_all foreach循环中使用一个简单的count变量创建了这个ID。

每个视频所需的$ uniqueID工作得很好。如果我的$ content中有3个[track = url],我会得到3个不同的id(玩家_1,玩家_2,玩家_3等等)

但是,我所遇到的主要问题是我不知道在这种情况下我是如何使用preg_replace的。我需要为每个视频返回embedCode,每个视频都包含我正在创建的唯一ID。

<?php

    $youtubeUrl = "/(\[TRACK=)((http|https)(\:\/\/)(www|it|co\.uk|ie|br|pl|jp|fr|es|nl|de)(\.youtube\.)(com|it|co\.uk|ie|br|pl|jp|fr|es|nl|de)([a-zA-Z0-9\-\.\/\?_=&;]*))(\])/si";

    $search = preg_match_all($youtubeUrl, $content, $matches, PREG_OFFSET_CAPTURE);
    $i = 0;

    foreach ($matches[8] as $match) {

        $watch = $match[0];

        //unique id
        $uniqueID = "player_" . $i; // player_0, player_1, player_2 ...

        //final video url
        $video = $uri . $watch;

        echo $video . "<br/>"; //correct 3 times different

        $content = preg_replace($youtubeUrl, embedCode($video, $uniqueID), $content);
        // three times player_0

        $i++;
    }

    //$content = preg_replace($youtubeUrl, embedCode($video, $uniqueID), $content);
    // three times player_3

    return $content;

?>

知道我需要做什么吗?我很无奈! 如果我在循环中调用preg_replace,我得到了player_0的embed_code的三倍,如果我在foreach循环之外调用它,我会得到三次player_3。

我在这里做错了什么!非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

您不应手动循环匹配结果,然后再运行第二个preg_replace。这是preg_replace_callback简化事情的完美用例:

$i = 0;
$content = preg_replace_callback($rx_youtubeUrl, "cb3", $content);

function cb3 ($match) {

    $watch = $match[8];
    global $i, $uri;
    $i++;

    //unique id
    $uniqueID = "player_" . $i; // player_0, player_1, player_2 ...

    //final video url
    $video = $uri . $watch;

    return embedCode($video, $uniqueID);
}

对于$ uniqueID,您可能必须使用全局变量或静态变量。

同一个ID出现三次是由preg_replace运行所有出现的正则表达式引起的。它不只是找到当前的[TRACK=..,而是一次性删除所有内容。您可以选择使用静态str_replace。