За последние 24 часа нас посетили 18432 программиста и 1632 робота. Сейчас ищет 1061 программист ...

Как удалить пустые теги

Тема в разделе "Регулярные выражения", создана пользователем php), 2 апр 2014.

  1. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Здравствуйте!
    Ни как не могу допереть как можно удалить все теги со строки без содержимого, типа <p> </p>, <b> </b> и т.д.
    При пользовательском вводе они создают огромный мусор. Хотел сделать это регуляркой:
    $str = preg_replace("/(<.+?>[\s]{0,}<\/.+?>)/uis", " ", $str);
    Но данный код удаляет все теги кроме текста.
    Ктонибудь подскажет как можно осуществить подобное одним регулярным выражением?
     
  2. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Вроде разобрался:
    $str = preg_replace("#(<[^\/]>[\s]{0,}<\/.+?>)#uis", "", $str);
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    [\s]{0,} можно просто \s*
     
  4. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Спасибо!

    Спасибо!
     
  5. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    УПСС!
    Кажется я поторопился с выводами.
    $str = preg_replace("#(<[^\/]>\s*<\/.+?>)#uis", "", $str);
    это выражение не удаляет теги с двумя и более символами скажем <span></span>
    Почему? ктонибудь может ответить?
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Хз. Может вопросительный знак в конце лишний
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    потому что <[^\/]> это строго один символ (не слеш) внутри угловых скобок

    [^\/] замени на [^\/].+?

    Добавлено спустя 8 минут 37 секунд:
    всё равно регулярка будет говно ))) потому что будет удалять например "<br> </span>".

    тут надо рекурсивную регулярку. примеры в сети есть, ищи.
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $str='<span>cbcvnb<br>derfgrg<span class="sss"></span><div></div><br>dkl;fgsd;gkdfg</span>';
    2. $str=preg_replace('~(<(.*)[^<>]*>\s*<\/\\2>)~i','',$str);
    3. echo $str; //<span>cbcvnb<br>derfgrg<br>dkl;fgsd;gkdfg</span> 
     
  9. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    всё равно регулярка будет говно ))) потому что будет удалять например "<br> </span>".

    Но я предварительно проверяю текст через класс, который автоматически подставляет слеши ко всем не закрывшимся тегам и <br> исправляет на <br />. А за совет огромное Спасибо и за позитивную критику тоже.
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $str='<span><br></span>';
    2. $str=preg_replace('~(<(.*)[^<>]*>\s*<\/\\2>)~i','',$str);
    Пожалуйста...
    Если вы не умеете видеть глазами, то вовсе забейте на программирование...
     
  11. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    На самом деле очень грамотно и лаконично! Спасибо огромное помогли!
    Просто я с регулярками сталкиваюсь редко. Не обессудьте если кому мой говнокод порезал глаз
     
  12. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    Чем дальше в лес, тем больше дров...
    С удалением одиночных тегов разобрался (респект тебе your), но как быть, когда теги следуют друг за другом каскадом,
    скажем $str = '11111<span><span><span>22222</span></span></span>333333';
    Не получается разбить запрос по вышеуказанной функции, применима ли она в данном конкретном случае?
     
  13. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    На ум более ничего не приходит:
    Код (Text):
    1.  
    2. $str = '11111<br></br><table><tr><td></table><span><span><span>22222</span></span></span>333333';
    3. echo preg_replace('~(<(.*)[^<>]*>\s*<\\2>)+~i','',$str); // выводит 11111<br></br><table><tr><td></table><span>22222</span>333333
    На сколько валиден данный код?
     
  14. php)

    php) Активный пользователь

    С нами с:
    29 янв 2014
    Сообщения:
    30
    Симпатии:
    0
    А как быть с такой конструкцией??
    $str = '11111<span class="A"><span style="B"><span id="WTF">22222</span></span></span>333333';
     
  15. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что с ней?
     
  16. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вы сядьте, подумайте, и сформулируйте четко задачу, когда что нужно удалять а когда не нужно.
    после этого начинайте искать решение.
    а если вы постоянно придумывать новые условия - то помогать вам будет все менее интересно. так как не видно ни конца ни края. нафантазировать можно много
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Вам дали решение в чем проблема?
    Ну они же не пустые, с чего бы они убирались? Они вложены друг в друга, если вы хотите этого избежать, копайте в сторону " Условные подмаски " и " Рекурсивные шаблоны ", а лучше всего суда и тут все есть: Синтаксис регулярных выражений