Логика работы a{get}b|{multiget} или удалить тег A вокруг IMG

Тема в разделе "Функции поиск-замены и регулярные выражения", создана пользователем madgrok, 7 мар 2018.

Метки:
  1. madgrok

    madgrok New Member Пользователи

    Регистрация:
    5 мар 2018
    Сообщения:
    4
    Например, есть такой html текст.
    Код:
    ...
    <p>
    <strong>Вот уже несколько дней в области бушует непогода. Сегодня ночью Простоквашино снова занесло снегом. Сегодня коммунальщики вышли на борьбу с заносами с <a href="http://site.com /news/article/52222/">новой снегоуборочной техникой</a>, которая была приобретена за бюджетные средства в конце января.</strong></p>
    <p>
    С утра работники ФЛП Матроскин производили очистку тротуаров около общежития педагогического колледжа Простоквашино.</p>
    <a class="fancybox" href="img/_UJpSdHZwVgBY.jpg" rel="group"><img alt="" src="img/_UJpSdHZwVgBY.jpg" title="" /></a></p>
    <p>
    Однако эффективность работы данной техники вызывает сомнения: весь снег, который  прогоняется через машину, осыпается на головы дворников и снова ложится на дорогу.</p>
    <p>
    <a class="fancybox" href="img/_K8T5YOH3MOEG.jpg" rel="group"><img alt="" src="img/_K8T5YOH3MOEG.jpg" title="" /></a></p>
    …
    
    Нужно вокруг тега img удалить тег a. Пробую решить это с помощью следующей конструкции
    Код:
    <a class="fancybox" href="{skip}"|<a class="fancybox" href=""
    <a class="fancybox" href="" rel="group">{get}</a>|{multiget}
    
    После этого остаются только img, всё остальное, включая текст удаляется.
    Код:
    <img alt="" src="img/_UJpSdHZwVgBY.jpg" title="" /></p>
    <img alt="" src="img/_K8T5YOH3MOEG.jpg" title="" /></p>
    
    Почему так? Я ожидал эффекта удаления только <a class="fancybox" href="" rel="group"> …</a> вокруг img. Как-то так
    Код:
    ...
    <p>
    <strong>Вот уже несколько дней в области бушует непогода. Сегодня ночью Простоквашино снова занесло снегом. Сегодня коммунальщики вышли на борьбу с заносами с <a href="http://site.com /news/article/52222/">новой снегоуборочной техникой</a>, которая была приобретена за бюджетные средства в конце января.</strong></p>
    <p>
    С утра работники ФЛП Матроскин производили очистку тротуаров около общежития педагогического колледжа Простоквашино.</p>
    <img alt="" src="img/_UJpSdHZwVgBY.jpg" title="" /></p>
    <p>
    Однако эффективность работы данной техники вызывает сомнения: весь снег, который  прогоняется через машину, осыпается на головы дворников и снова ложится на дорогу.</p>
    <p>
    <img alt="" src="img/_K8T5YOH3MOEG.jpg" title="" /></p>
    …
    
    Пробовал в одну строку
    Код:
    <a class="fancybox{skip}>{get}</a>|{multiget}
    эффект тот же, остаются только img.
    Что я делаю не так?
     
  2. xLime

    xLime Well-Known Member Супер Модератор Модератор

    Регистрация:
    4 сен 2017
    Сообщения:
    339
    Добрый день.
    Код:
    <a{skip}>|
    </a>|
     
    Root нравится это.
  3. Root

    Root Администратор Команда форума Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    9.663
    Город:
    Сочи
    Здравствуйте.

    Почитайте про {multiget} Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме!

    Непонятно, зачем вы его вообще используете для решения данного вопроса.
     
  4. madgrok

    madgrok New Member Пользователи

    Регистрация:
    5 мар 2018
    Сообщения:
    4
    Это не подходит т.к. удаляет все ссылки без исключения, а нужно только обёртку A вокруг IMG
     
  5. Root

    Root Администратор Команда форума Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    9.663
    Город:
    Сочи
    Используйте для этого регулярные выражения (я их не изучал).

    Для более подробного ознакомления с работой регулярных выражений вы можете изучить Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме! .
     
  6. xLime

    xLime Well-Known Member Супер Модератор Модератор

    Регистрация:
    4 сен 2017
    Сообщения:
    339
    Попробуйте:
    Код:
    <a{skip}><img|@@@<a{skip(1)}>@@@<img
    @@@{skip}@@@|
     
  7. Root

    Root Администратор Команда форума Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    9.663
    Город:
    Сочи
    Да не прокатит это, я же написал, что нужно использовать регулярные выражения! А если и ими нельзя, то писать специальный макрос, но уже за деньги.
     
    Последнее редактирование: 7 мар 2018
  8. madgrok

    madgrok New Member Пользователи

    Регистрация:
    5 мар 2018
    Сообщения:
    4
    Прощу прощения, читал и видео смотрел, видать запарился. )) Получается a{get}b|{multiget} вытягивает из текста только {get}. Выходит это аналог обычных границ парсинга?

    У меня есть другое решение, но там условия замены не столь категоричны, может так случиться что попадутся исключения и вся логика поломается.
    Код:
    <a class="fancybox{skip}"group">|
     /></a>| />
    
    Ладно, я так и подозревал что без регулярок не обойтись )
     
  9. xLime

    xLime Well-Known Member Супер Модератор Модератор

    Регистрация:
    4 сен 2017
    Сообщения:
    339
    :eek:

    Вроде работает. Проверяйте.
    Код:
    re:<a[^<]+(<img.+?>)</a>|$1
    [​IMG]
     
    Root нравится это.
  10. Root

    Root Администратор Команда форума Администратор

    Регистрация:
    10 мар 2010
    Сообщения:
    9.663
    Город:
    Сочи
    С {multiget} - аналог повторяющихся границ парсинга, с {get} (во второй части правила поиск-замены) - аналог обычных границ парсинга.
     
  11. madgrok

    madgrok New Member Пользователи

    Регистрация:
    5 мар 2018
    Сообщения:
    4

    Да, безусловно регулярка работает, это даже не обсуждается.

    P.S. IMHO ) Теперь вот задаюсь вопросом, зачем весь этот огород когда есть регулярные выражения? А ещё интереснее phpQuery. Я почему-то думал будет что-то похожее, только проще в использовании, так сказать с низким порогом вхождения.
     
  12. Kreol

    Kreol Модератор Команда форума Модератор

    Регистрация:
    6 янв 2013
    Сообщения:
    2.345
    Потому что их нужно понимать и знать как писать. А это к сожалению не так просто.
    На самом деле выдумывать велосипед давно не надо. По факту все уже давно придумано, Мы только пользуемся теми или иными инструментами. А писать что-то свое, это трудно и обычно невостребованно.
     

Поделиться этой страницей