Как правильно заменить несколько значений переменной в PHP? Приветствую Сразу отмечу — в PHP не силен. Пытаюсь заменить значения переменной на нужные, но толком ничего не получается, то одно, то другое. Что я делал:// это наши данные $content = ' Первая строка Вторая строка ВИДЕО:https://www.youtube.com/watch?v=dlkfghn9odnfvbde&t=644s Третья строка Четвертая строка ВИДЕО:https://www.youtube.com/watch?v=bnviufedyfgbvpo9&t=644s Пятая строка '; // ищум подстроку / строку $find = '/ВИДЕО:.*/'; // получаем массив с найденными элементами preg_match_all($find, $content, $videos); // перебираем элементы массива и ищем совпадения > меняем foreach ($videos[0] as $line){ // делим строку по разделителю $video_url = explode("watch?v=", $line); // формируем нужный вид (для замены строки) $video_content = 'ID видео: ' . $video_url[1] . ''; // меняем найденное совпадение на нужноен $content = preg_replace($line, $video_content, $content); } echo $content; В итоге значение переменной $content должно по задумке преобразоваться в такое:$content = ' Первая строка Вторая строка ID видео: dlkfghn9odnfvbde&t=644s Третья строка Четвертая строка ID видео: bnviufedyfgbvpo9&t=644s Пятая строка '; Но, как видимо, что-то делаю не так. Помогите пожалуйста разобраться — что не так и как нужно правильно переписать, чтобы заработало.
Проблема в использовании функции preg_replace. Вместо сразу заменять найденное совпадение на нужную строку, нужно сначала найти позицию совпадения в исходной строке, затем заменить его.
Вот исправленный код:
// это наши данные $content = ' <p>Первая строка</p> <p>Вторая строка</p> ВИДЕО:https://www.youtube.com/watch?v=dlkfghn9odnfvbde&t=644s <p>Третья строка</p> <p>Четвертая строка</p> ВИДЕО:https://www.youtube.com/watch?v=bnviufedyfgbvpo9&t=644s <p>Пятая строка</p> '; // ищем подстроку / строку $find = '/ВИДЕО:.*/'; // получаем массив с найденными элементами preg_match_all($find, $content, $videos); // перебираем элементы массива и ищем совпадения > меняем foreach ($videos[0] as $line) { // делим строку по разделителю $video_url = explode("watch?v=", $line); // формируем нужный вид (для замены строки) $video_content = '<div>ID видео: ' . $video_url[1] . '</div>'; // находим позицию совпадения в исходной строке $pos = strpos($content, $line); // заменяем найденное совпадение на нужное $content = substr_replace($content, $video_content, $pos, strlen($line)); } echo $content;
Теперь код должен работать правильно и вывести ожидаемый результат.
Проблема в использовании функции preg_replace. Вместо сразу заменять найденное совпадение на нужную строку, нужно сначала найти позицию совпадения в исходной строке, затем заменить его.
Вот исправленный код:
// это наши данные$content = '
<p>Первая строка</p>
<p>Вторая строка</p>
ВИДЕО:https://www.youtube.com/watch?v=dlkfghn9odnfvbde&t=644s
<p>Третья строка</p>
<p>Четвертая строка</p>
ВИДЕО:https://www.youtube.com/watch?v=bnviufedyfgbvpo9&t=644s
<p>Пятая строка</p>
';
// ищем подстроку / строку
$find = '/ВИДЕО:.*/';
// получаем массив с найденными элементами
preg_match_all($find, $content, $videos);
// перебираем элементы массива и ищем совпадения > меняем
foreach ($videos[0] as $line) {
// делим строку по разделителю
$video_url = explode("watch?v=", $line);
// формируем нужный вид (для замены строки)
$video_content = '<div>ID видео: ' . $video_url[1] . '</div>';
// находим позицию совпадения в исходной строке
$pos = strpos($content, $line);
// заменяем найденное совпадение на нужное
$content = substr_replace($content, $video_content, $pos, strlen($line));
}
echo $content;
Теперь код должен работать правильно и вывести ожидаемый результат.