Выбрать картинки из текста и вставить в отдельное поле

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X

Составить регулярное выражение на sql

#1 1 ноября 2019 в 21:22
Переношу мой старый сайт с другой cms на Instantcms 2.12.2 с помощью компонента "Импорт данных" (спасибо автору).
Проблема в том, что в той cms для новостей не было отдельного поля для изображения и я вставлял изображение прямо в текст. В общем кто разбирается в sql нужно регулярное выражение для поиска изображения в тексте или хотя бы ссылку где можно про это почитать, так как те примеры регулярок которые я нашёл простейшие…
#2 1 ноября 2019 в 21:29

не было отдельного поля для изображения и я вставлял изображение прямо в текст.

vpugachev
Ничего страшного.
Несмотря на то, что ссылка на изображение в тексте, сами файлы всё равно лежат в upload.
Всё нормально, не надо ничего делать.
-------------------------------------------------------------
Или Вы хотите, чтобы первая картинка из поля content вставлялась в поле image?
#3 1 ноября 2019 в 21:58

Или Вы хотите, чтобы первая картинка из поля content вставлялась в поле image?

Ris

Да именно так. Так думаю будет правильно. Т. к. иначе проблемы при выводе в виджитах получаются.
#4 1 ноября 2019 в 22:02

с помощью компонента "Импорт данных"

vpugachev
а сделайте ссылочку на компонент
#5 1 ноября 2019 в 22:12

Да именно так. Так думаю будет правильно. Т. к. иначе проблемы при выводе в виджитах получаются.

vpugachev
Обговорим алгоритм.
Если поле image заполнено — не трогаем. Если не заполнено — ищем первую картинку в тексте и вставляем её?
#6 1 ноября 2019 в 22:48


с помощью компонента "Импорт данных"

vpugachev
а сделайте ссылочку на компонент

dChirkis

instantcms.ru/addons/dumper.html



Если поле image заполнено — не трогаем. Если не заполнено — ищем первую картинку в тексте и вставляем её?

Ris

это идеальный вариант!
#7 1 ноября 2019 в 23:03
vpugachev,
Это будет одноразовое действие или это придется делать при каждом добавлении контента? Или раз в день, например?
#8 1 ноября 2019 в 23:20


vpugachev,
Это будет одноразовое действие или это придется делать при каждом добавлении контента? Или раз в день, например?

Ris

Один раз, только что бы старые страницы привести к единообразию, когда изображение хранится в отдельном поле.
#9 2 ноября 2019 в 13:42
vpugachev,
Вот такую штуку сделал:
/users/files/download7437.html

Как пользоваться:
Обязательно сделать бэкап базы!!!
Установить из админки, открыть в редакторе файл \system\controllers\content\hooks\cron_img.php

  1. <?php
  2.  
  3. class onContentCronImg extends cmsAction {
  4.  
  5. public function run(){
  6.  
  7. /* Имя типа контента */
  8. $ctype = 'posts';
  9.  
  10. /* Имя поля картинки */
  11. $image = 'picture';
  12.  
  13. $content = $this->model->getContentItems($ctype);
  14.  
  15. foreach($content as $key => $value){
  16.  
  17. if(empty($value['picture'])){
  18.  
  19. preg_match_all('/<img .*?(?=src)src="\/upload\/([^"]+)"/i', $value['content'], $matches);
  20.  
  21. if(!empty($matches[1])){
  22.  
  23. $picture = $this->model->arrayToYaml(array('normal' => $matches[1][0], 'small' => $matches[1][0]), 3);
  24.  
  25. /* Если не нужно удалять картинки из текста - закомментируйте или удалите две строки ниже */
  26. $html = str_replace('<p><img src="/upload/'.$matches[1][0].'"></p>', '', $value['content']);
  27. $this->model->db->update('con_'.$ctype, 'id = '.$key, array('content' => $html));
  28.  
  29. $this->model->db->update('con_'.$ctype, 'id = '.$key, array($image => $picture));
  30.  
  31. }
  32.  
  33. }
  34.  
  35. }
  36.  
  37. }
  38.  
  39. }
Всё там заполнить, то есть тип контента, имя поля с картинкой. Если не нужно удалять изображение из текста — закомментируйте там две строки.
После чего зайдите Панель управления — Настройки — Планировщик. И стартаните вручную задание "Перенос картинок".
#10 2 ноября 2019 в 23:22
Большое спасибо. Все сработало отлично.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.