哎, 我不知道我做错了什么。 我有一个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。
我在这里做错了什么!非常感谢你的帮助。
答案 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。