PHP возвращает preg_replace () внутри foreach? - PullRequest
1 голос
/ 19 февраля 2011

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

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

$ uniqueID, который мне нужен для каждого видео, отлично работает. Если у меня есть 3 [track = url] в моем контенте $, я получаю 3 разных идентификатора (player_1, player_2, player_3 и т. Д ...)

Однако ЕДИНСТВЕННАЯ ОСНОВНАЯ ПРОБЛЕМА, которую я имею, состоит в том, что я понятия не имею, как я использую preg_replace в этом случае. Мне нужно вернуть код embedCode для каждого видео с каждым уникальным идентификатором, который я создаю.

<?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, я получаю три раза player_3.

Что я здесь не так делаю! Большое спасибо за вашу помощь.

1 Ответ

3 голосов
/ 19 февраля 2011

Вы не должны вручную зацикливаться на результатах матча, а затем запускать второй 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 в качестве альтернативы.

...