PHP возвращает preg_replace () внутри foreach?

эй, я понятия не имею, что я делаю неправильно. У меня есть шаблон регулярного выражения, который ищет URL-адрес youtube внутри или [track = url].

Я возвращаю вставляемый код youtube, если regexp сопоставляется. Мне нужно иметь уникальный идентификатор для каждого видео. Я создаю этот идентификатор с простой переменной счетчика внутри моего цикла preg_match_all foreach.

$ UniqueID, который мне нужен для каждого видео, отлично работает. Если у меня есть 3 [track = url] внутри моего $ content, я получаю 3 разных идентификатора эха (player_1, player_2, player_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 внутри цикла, я получу три раза код embed_code для player_0, если я вызову его вне цикла foreach, я получаю три раза игрока_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 в качестве альтернативы.