Здравствуйте! Ни как не могу допереть как можно удалить все теги со строки без содержимого, типа <p> </p>, <b> </b> и т.д. При пользовательском вводе они создают огромный мусор. Хотел сделать это регуляркой: $str = preg_replace("/(<.+?>[\s]{0,}<\/.+?>)/uis", " ", $str); Но данный код удаляет все теги кроме текста. Ктонибудь подскажет как можно осуществить подобное одним регулярным выражением?
УПСС! Кажется я поторопился с выводами. $str = preg_replace("#(<[^\/]>\s*<\/.+?>)#uis", "", $str); это выражение не удаляет теги с двумя и более символами скажем <span></span> Почему? ктонибудь может ответить?
потому что <[^\/]> это строго один символ (не слеш) внутри угловых скобок [^\/] замени на [^\/].+? Добавлено спустя 8 минут 37 секунд: всё равно регулярка будет говно ))) потому что будет удалять например "<br> </span>". тут надо рекурсивную регулярку. примеры в сети есть, ищи.
Код (PHP): $str='<span>cbcvnb<br>derfgrg<span class="sss"></span><div></div><br>dkl;fgsd;gkdfg</span>'; $str=preg_replace('~(<(.*)[^<>]*>\s*<\/\\2>)~i','',$str); echo $str; //<span>cbcvnb<br>derfgrg<br>dkl;fgsd;gkdfg</span>
всё равно регулярка будет говно ))) потому что будет удалять например "<br> </span>". Но я предварительно проверяю текст через класс, который автоматически подставляет слеши ко всем не закрывшимся тегам и <br> исправляет на <br />. А за совет огромное Спасибо и за позитивную критику тоже.
Код (PHP): $str='<span><br></span>'; $str=preg_replace('~(<(.*)[^<>]*>\s*<\/\\2>)~i','',$str); Пожалуйста... Если вы не умеете видеть глазами, то вовсе забейте на программирование...
На самом деле очень грамотно и лаконично! Спасибо огромное помогли! Просто я с регулярками сталкиваюсь редко. Не обессудьте если кому мой говнокод порезал глаз
Чем дальше в лес, тем больше дров... С удалением одиночных тегов разобрался (респект тебе your), но как быть, когда теги следуют друг за другом каскадом, скажем $str = '11111<span><span><span>22222</span></span></span>333333'; Не получается разбить запрос по вышеуказанной функции, применима ли она в данном конкретном случае?
На ум более ничего не приходит: Код (Text): $str = '11111<br></br><table><tr><td></table><span><span><span>22222</span></span></span>333333'; echo preg_replace('~(<(.*)[^<>]*>\s*<\\2>)+~i','',$str); // выводит 11111<br></br><table><tr><td></table><span>22222</span>333333 На сколько валиден данный код?
А как быть с такой конструкцией?? $str = '11111<span class="A"><span style="B"><span id="WTF">22222</span></span></span>333333';
вы сядьте, подумайте, и сформулируйте четко задачу, когда что нужно удалять а когда не нужно. после этого начинайте искать решение. а если вы постоянно придумывать новые условия - то помогать вам будет все менее интересно. так как не видно ни конца ни края. нафантазировать можно много
Вам дали решение в чем проблема? Ну они же не пустые, с чего бы они убирались? Они вложены друг в друга, если вы хотите этого избежать, копайте в сторону " Условные подмаски " и " Рекурсивные шаблоны ", а лучше всего суда и тут все есть: Синтаксис регулярных выражений