Нужна помощь по обработке данных в textarea (регулярка и прочее)?

Тема в разделе "Регулярные выражения", создана пользователем danneo, 16 янв 2016.

Модераторы: xpert13
  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.475
    Симпатии:
    114
    Подключил к полю виз.редактор tinymce (делаю в DLE).
    Например, в textarea можно скопировать любой текст с другого сайта, где будут картинки, ссылки и вставить в поле. Все это так и вставится.
    1 задача:
    На стороне сервера нужно все это дело удалить:
    • ссылки, которые на другие сайты, оставив анкор ссылки
    • любые картинки, со сторонних сайтов
    • убрать все теги, которые нельзя использовать. Допустимые: H2-H4, a (со своего сайта), b, ul, ol, li, img (со своего сайта), p. strong.
    2 задача:
    После чего, у меня есть массив названий картинок, которые были загружены на сервер (во временный каталог), назовем его $arr_uploads (из скрытых полей input).
    Нужно получить все картинки из textarea (которые остались после вырезания запрещенных тегов), и сравнить с $arr_uploads . Названия файлов из массива $arr_uploads, которые не были найдены в textarea, нужно будет удалить из временной папки сервера (это мусор). Это нужно, т.к. картинку в textarea пользователь могу удалить клавишей del, а с сервера нет. Оставшиеся скопируются в постоянный каталог.

    Примерно все понимаю, но все же нужна помощь. С регуляркой у меня туго.

    1. Не знаю как правильно вырезать теги, особенно те, что со ссылкой, ведущей на внешний сайт.
    2. Как собрать массив всех названий картинок из textarea для дальнейшей обработки.
     
  2. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    251
    Ты через php текст будешь прогонять, или js'oм делать?
    https://regex101.com/r/lU8qC4/1 вот так можно получить анкор, и функцией preg_replace заменить полную ссылку на то значение что получил https://regex101.com/r/lU8qC4/2

    https://regex101.com/r/jT9kU7/1 это картинки, но на php регулярка, на js переделать не проблемма. Но сам механизм сбора в js я не знаю :( я с ним не работал.
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.475
    Симпатии:
    114
    Делаю все на php. На стороне юзера, мне кажется, это делать лишнее.
    Сайт с редактором функциональный, но не зная английского и легулярки, разобраться толком не смог. Да и не пользовался подобными. Получилось взять одну картинку, а когда их много в тексте, уже каша получалась.
    Например, картинки... У них могут быть разные атрибуты (стандартные и нестандартные, типа data-holder=""), да и быть или не быть слеш на конце, пример: https://regex101.com/r/jT9kU7/3

    По ссылкам вообще не понял. Ну получил я массив анкоров (ссылок), и что? Мне то нужно вырезать все ссылки из текста, которые ведут на внешние сайты.
    Может быть проблема в непонимании этого сайта, как использовать полученную регулярку.
     
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    229
    Симпатии:
    305
    Как собрать массив всех названий картинок. https://regex101.com/r/jT9kU7/4
    PHP:
    $text = <<<LOL
    Как собрать массив всех названий <img width="250" src="http://site.ru/img.jpg" class="img" />картинок из textarea для <img width="250" src="http://site.ru/img.jpg" class="img" />дальнейшей обрfdsfa sdfa sыва фыва фыва фыва фываф ыав<p>аб</p>оfas dfasdf
    sadf asdf asdf a<img width="250" src="http://site.ru/img.jpg" class="img" />sdf asfdтки.
    <img width="250" src="http://site.ru/images/folder/img.jpg" class="img" />
    LOL;

    preg_match_all('@<img[^>]+src="(?:[^"/]*/)+([^"]+)@i'$text$matches);

    print_r($matches[1]);
    Удаление картинок со сторонних сайтов https://regex101.com/r/jT9kU7/5.
    Удаление ссылок на другие сайты, оставив анкор ссылки https://regex101.com/r/jT9kU7/6
    PHP:
    // Удаление ссылок на другие сайты, оставив анкор ссылки
    $text preg_replace('@<a[^>]+href="http://(?:www\.)?+(?!mysite\.ru)[^>]*>(.*?)</a>@is''\1'$text);

    // Удаление картинок со сторонних сайтов
    $text preg_replace('@<img[^>]+src="http://(?:www\.)?+(?!mysite\.ru)[^>]*>@i'''$text);

    // Удаление всех тегов кроме допустимых
    $text preg_replace('@</?((h[2-4]|a|b|p|ul|ol|li|img|strong)[^>]*>\K|\S+[^>]*>)@i'''$text);

    echo 
    $text;
     
    Последнее редактирование: 16 янв 2016
    danneo нравится это.
  5. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    251
    Этот сайт только для подбора и проверки регулярок. Что бы находило несколько вхождений - нужен модификатор "g" а в php это равнозначно preg_match_all(); для замены я писал - используй preg_replace(); на php.net все функции описаны и имеют много примеров.
     
  6. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.475
    Симпатии:
    114
    Огромное кол-во времени сэкономили, благодарю!
    Но есть небольшая проблемка с вырезанием разрешенных тегов (Удаление всех тегов кроме допустимых). После этого действия выводит хрень какую-то:
    Код:
    <p>
    
    
    
    
      0false
    
      falsefalse
      X-NONEX-NONE
     
  7. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    229
    Симпатии:
    305
    А вообще есть же функция strip-tags
    PHP:
    $text strip_tags($text'<p><a><img><b><ul><ol><li><strong><h2><h3><h4>');
     
    danneo нравится это.
  8. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.475
    Симпатии:
    114
    вот я и вспоминал, это дело. Помню, что что-то так делается, а вспомнить не мог :) перегруз уже