За последние 24 часа нас посетили 17603 программиста и 1732 робота. Сейчас ищут 1023 программиста ...

Замена html контейнера.

Тема в разделе "PHP для новичков", создана пользователем oxana77, 7 авг 2017.

  1. oxana77

    oxana77 Новичок

    С нами с:
    7 авг 2017
    Сообщения:
    23
    Симпатии:
    0
    Доброго вечера.
    Помогите пожалуйста советом (желательно с примером).
    Только не камнями, не спец в php (Спасибо).

    На примере Joomla.
    В этом движке есть такое понятие как материал, материал создается подобным js визуальным редактором, в котором я и пишу этот вопрос на сайте php.ru.
    Все что мы сделали в редакторе, записывается в одну переменную(ячейку) в БД.
    Все-все-все - это не просто текст, а html разметка с контейнерами, свойствами и.т.д.

    Что нужно - выдрать все теги img и записать на их место другие (Seo тема - высота, ширина, альт, титл).

    Парсим:

    $art_html = $this->item->text; // это собственно наш кусок html - материала из база

    preg_match_all('/<img[^>]+>/i',$art_html, $result_img, PREG_OFFSET_CAPTURE); // парсим img теги

    Спарсили все ок.
    Да тут ми имеем еще и вхождение.

    Пробуем подставить ширину и глубину, хотя бы в шаблон замены.

    preg_match_all('/src=("[^"]*")/i',$result_img[0][0][0], $img);

    $size = getimagesize (str_replace('"','', $img[1][0]));

    $new_img = "<img src={$img[1][0]} {$size[3]} >" // готовая картинка с размерами

    Все отлично, получили img тег с реальными размерами картинки.

    теперь нужно старый img заменить на новый.
    Для замены мы имеем или полностью старый img тег или вхождение + можно посчитать длину старого тега.

    Ну ни как не получается! Ни так, ни сяк - видимо, что-то в экранировании служебных символоа типа -
    < > = " : / апостоф.

    Подскажите что-то.
    Спасибо!
    Плачу!
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не надо DOM регулярными выражениями. Всё гораздо проще: DOMDocument или (мне больше нравится) http://simplehtmldom.sourceforge.net/manual.htm - находите ваши изображения запросами типа jQuery и меняете что надо.
     
  3. oxana77

    oxana77 Новичок

    С нами с:
    7 авг 2017
    Сообщения:
    23
    Симпатии:
    0
    Мне нужно именно средствами php, с помощью js это уже не SEO тема будет.
    В редакторе, я ковырялась он весь на js - не потяну, то же думала на моменте записи в БД это сделать,
    я помру - 100 мильенов раз!
    --- Добавлено ---
    Вот тогда еще такой вопрос, а есть ли в php ограничения на работу с строками?
    Как я понимаю, все функции обработки строк в php - строки.
    Просто столкнулась в lua там четко написаны ограничения - длинны, символов, кодировки.
    --- Добавлено ---
    все функции обработки строк в php - строки
    Щя будут ржать и тролиь :)
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я же не сказал на jQuery, я сказал, что библиотека позваляет разботать с DOM как на jQuery, но из php.
     
  5. oxana77

    oxana77 Новичок

    С нами с:
    7 авг 2017
    Сообщения:
    23
    Симпатии:
    0
    Извините ссылку не посмотрела!
    По быстрому глянула, вопрос не как найти, а как заменить известное данные средствами php, в данных состоящих их 0 до 255.
    Я, не гуру!
     
  6. oxana77

    oxana77 Новичок

    С нами с:
    7 авг 2017
    Сообщения:
    23
    Симпатии:
    0
    Вопрос как заменить!
    Не уж то ни кто не знает?
     
  7. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Стоит почитать про preg_match_all, но в данном случае если совпадения не будет обработаны в цикле лучше использовать preg_match.

    Продолжу логическую цепочку:
    Код (PHP):
    1. // Делаем замену
    2. $art_html = str_replace($result_img[0], $new_img);
    Для экранирования символов регулярок функция preg_quote
    Код (PHP):
    1. $art_html = preg_replace('/' . preg_quote($result_img[0]) . '/', $new_img);
    Не плачь, почитай про функции для работы с регулярками

    А я бы делал замену сразу:
    Код (PHP):
    1. $art_html = preg_replace_callback('/<img[^>]+>/i', function($matches) {
    2.     preg_match('/src=("[^"]*")/i', $matches[0][0], $img);
    3.     $size = getimagesize(str_replace('"','', $img[1]));
    4.     return "<img src={$img[1][0]} {$size[3]} >";
    5. }, $art_html);
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну я обычно делаю так - через ту либу заменяю в сгенерированной dom-структуре, потом собираю обратно в html - одним вызовом. Там можно с найденными элементами DOM работать напрямую - заменять атрибуты, менять текст и т.п.
     
  9. oxana77

    oxana77 Новичок

    С нами с:
    7 авг 2017
    Сообщения:
    23
    Симпатии:
    0
    Сделала, спасибо.
    Спешила
    $new_img = "<img src={$img[1][0]} {$size[3]} >" // готовая картинка с размерами
    В конце не поставила точку с запятушкой,
    Что было ниже не срабатывало.
    Цельный день в корзину :)
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв