SQL Найти и заменить часть текста с тегами

95
02 марта 2021, 05:50

В базе данных, в поле description есть фрагмент кода:

<video id="58e482246c5fb6426489b990b1057fe1" class="video-js vjs-default-skin vjs-youtube" controls preload="auto" width="560" height="315" poster="%3Cimg+src%3D%22%2Fimages%2Fproduct%2F200x150%2F60713.jpg%22+alt%3D%22%22+width%3D%22200%22+height%3D%22150%22+%2F%3E" data-setup='{"techOrder":["youtube"],"src":"https://www.youtube.com/watch?v=eLL9ZuaZ_kY"}'></video>

или для наглядности:

<video id="58e482246c5fb6426489b990b1057fe1" class="video-js vjs-default-skin vjs-youtube" controls="" preload="auto" width="560" height="315" poster="%3Cimg+src%3D%22%2Fimages%2Fproduct%2F200x150%2F44684.jpg%22+alt%3D%22%22+width%3D%22200%22+height%3D%22150%22+%2F%3E" data-setup="{&quot;techOrder&quot;:[&quot;youtube&quot;],&quot;src&quot;:&quot;https://www.youtube.com/watch?v=63PkeC4Rl5k&amp;feature=youtu.be&quot;}"></video>

Можно ли с помощью SQL запроса убрать всё лишнее, оставить только ссылку и обернуть её в другой тэг? Чтобы получилось что-то вроде:

<iframe frameborder="0" src="//www.youtube.com/embed/63PkeC4Rl5k" width="640" height="360" class="note-video-clip"></iframe>

Обращаю внимания на то, что просто убрать все тэги не вариант, по-мимо этого фрагмента, есть ещё много чего другого.

Answer 1

что то типо дампа

CREATE TABLE IF NOT EXISTS `docs` (
  `id` int(6) unsigned NOT NULL,
  `content` varchar(450) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`,`content`) VALUES
  ('1', '<video id="58e482246c5fb6426489b990b1057fe1" class="video-js vjs-default-skin vjs-youtube" controls="" preload="auto" width="560" height="315" poster="%3Cimg+src%3D%22%2Fimages%2Fproduct%2F200x150%2F44684.jpg%22+alt%3D%22%22+width%3D%22200%22+height%3D%22150%22+%2F%3E" data-setup="{&quot;techOrder&quot;:[&quot;youtube&quot;],&quot;src&quot;:&quot;https://www.youtube.com/watch?v=63PkeC4Rl5k&amp;feature=youtu.be&quot;}"></video>')

ну и выборка

-- based on answer https://stackoverflow.com/a/7745635/808921
SELECT a.id, CONCAT('<iframe frameborder="0" ',SUBSTRING(a.content, POSITION("src&quot;:&quot;" IN a.content),POSITION("}" IN a.content) - POSITION("src&quot;:&quot;" IN a.content)),' width="640" height="360" class="note-video-clip"></iframe>') as Ссылка
FROM `docs` a

результат:

ну и ссылка на рабочий пример

время выполнения

что нужно понимать для запроса

substring - вырезает из строки указанное кол-во символов с указанного индекса

length - возвращает длину строки в байтах

position - возвращает индекс найденного элемента в строке

concat - слияние строк

Ну и чутка теории вам:

Первая нормальная форма - Отношение находится в 1НФ, если все его атрибуты являются простыми, все используемые домены должны содержать только скалярные значения. Не должно быть повторений строк в таблице.

Взято отсюда - это все к тому, что значение ссылки можно заносить в отдельный столбец в БД

READ ALSO
Как добавить запись в таблицу rbac

Как добавить запись в таблицу rbac

есть в yii2 такая вещь как rbac, в ней есть таблица auth_item_child, в ней поля parent и child, в эти поля можно вставить только значения из таблицы auth_item, поля...

94
Laravel API - в директорию домена

Laravel API - в директорию домена

Есть корпоративные сайты, к которым нужно прикрутить форум

122
Mikrotik php_api через safe mode

Mikrotik php_api через safe mode

Необходимо включение режима "Safe Mode" путем передачи запроса посредством php(api) на Mikrotik!

95