Jag vill ta bort alla tomma taggar från en sträng. En tom sträng kan tex vara <p></p> men även <p><br></p> eller <p> </p> etc.
Hur kan jag göra?
14 svar · 982 visningar · startad av learn
Jag vill ta bort alla tomma taggar från en sträng. En tom sträng kan tex vara <p></p> men även <p><br></p> eller <p> </p> etc.
Hur kan jag göra?
$text = preg_replace('/<(p|span|div)>(\s+|<br\s*\/*>)*<\/(p|span|div)>/i', '', $text);
/r Postade för snabbt.
Och, dags att bryta ner uttrycket lite grann:
(\s+|<br\s*\/*>)* innebär att (\s+|<br\s*\/*>) matchas noll eller flera gånger.
(\s+|<br\s*\/*>) betyder \s+ eller <br\s*\/*>
\s+ betyder ett eller flera blanksteg. <br\s*\/*> betyder <br>, eventuellt med mellanrum eller / i taggen. (\/* bör vara \/? kom jag på nu. :) )
Tack :bire
Alltså: $text = preg_replace('/<(p|span|div)>(\s+|<br\s*\/?>)*<\/(p|span|div)>/i', '', $text);
Om jag även vill ta bort alla <br> i slutet av strängen, hur gör jag?
Alltså om strängen tex ser ut så här: "<p>Hej hej hej hej hej<br>hejhejhej<br></p>" så ska den andra <br>:en tas bort. Kort sagt, kommer det inget text-innehåll efter en <br> så ska den tas bort.
Otestat, men jag tror att det ska funka:
$text = preg_replace('/(\s+|<br\s*\/?>)*<\/(p|span|div)>/i', '<\/{$2}>', $text);
Nja, det funkar inte riktigt...
Testade:
<? $text = '<p>sasda<br><br></p>' ?>
<input type="text" size="20" value="<?=preg_replace('/(\s+|<br\s*\/?>)*<\/(p|span|div)>/i', '<\/{$2}>', $text)?>" />
Fältet får detta värde:
fält skrev:
<p>sasda<\/{p}>
Detta funkar:
preg_replace('/(<br\s*\/?>)*<\/(p|span|div)>/i', '</$2>', $text)
Men nu vill jag att det inte skall behöva vara en omslutande tagg. Dvs så ska <br> även tas bort i följande: "hejhejhej<br>hejhejhej<br>" (ska bli "hejhejhej<br>hejhejhej").
Hur göra?
Min preg_replace skall alltså inte göra ngn skillnad på om <br> är omsluten med <p>/<span>/<div> eller ej. Dessutom ska mellanslag inte räknas som innehåll i detta fall.
Hur ska jag göra? :)
Nu vill jag även att tomma taggar med "style" skall tas bort.
Exempel:
hej hej hej hej hej<div style="font-size:11px; font-weight:bold"><br></div>hej hej hej hej
Ska bli:
hej hej hej hej hej hej hej hej hej
Det här är vad jag själv kommit fram till m.h.a. den hjälp jag tidigare fått av nitro2k01:
$text = preg_replace('/<(p|span|div)( style\=\"[^"])>(\s+|<br\s*\/*>)*<\/(p|span|div)>/i', '', $text);
Inte helt rätt, jag vet...
Hur gör man?
Ingen som vet...?
$text = preg_replace('/<(p|span|div)(?: style="[^"]*")?>(?:\s|<br(\s*\/)?>)*<\/\\1>/i', '', $text);
Peter S skrev:
$text = preg_replace('/<(p|span|div)(?: style="[^"]*")?>(?:\s|<br(\s*\/)?>)*<\/\\1>/i', '', $text);
Verkar funka bra, tack Peter!
learn skrev:
Men nu vill jag att det inte skall behöva vara en omslutande tagg. Dvs så ska <br> även tas bort i följande: "hejhejhej<br>hejhejhej<br>" (ska bli "hejhejhej<br>hejhejhej").
Hur göra?
Prova något i stil med:
$text = preg_replace('/<(p|span|div|)( style.*)?>(\s+|<br\s*\/?>)*<\/(p|span|div|)>|<br\s*\/?>$/i', '', $text);