webForumDet fria alternativet

Ta bort tomma taggar

PHPur PHP

14 svar · 982 visningar · startad av learn

learnMedlem sedan jan. 20051 130 inlägg
#1

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?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2
$text = preg_replace('/<(p|span|div)>(\s+|<br\s*\/*>)*<\/(p|span|div)>/i', '', $text);

/r Postade för snabbt.

learnMedlem sedan jan. 20051 130 inlägg
#3

Tack!

Vilka tecken räknas som "inget innehåll" i ditt exempel?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#4

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. :) )

learnMedlem sedan jan. 20051 130 inlägg
#5

Tack :bire

Alltså: $text = preg_replace('/<(p|span|div)>(\s+|<br\s*\/?>)*<\/(p|span|div)>/i', '', $text);

learnMedlem sedan jan. 20051 130 inlägg
#6

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.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#7

Otestat, men jag tror att det ska funka:

$text = preg_replace('/(\s+|<br\s*\/?>)*<\/(p|span|div)>/i', '<\/{$2}>', $text);
learnMedlem sedan jan. 20051 130 inlägg
#8

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}>

learnMedlem sedan jan. 20051 130 inlägg
#9

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?

learnMedlem sedan jan. 20051 130 inlägg
#10

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? :)

learnMedlem sedan jan. 20051 130 inlägg
#11

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?

learnMedlem sedan jan. 20051 130 inlägg
#12

Ingen som vet...?

Peter SMedlem sedan dec. 20025 483 inlägg
#13
$text = preg_replace('/<(p|span|div)(?: style="[^"]*")?>(?:\s|<br(\s*\/)?>)*<\/\\1>/i', '', $text);
learnMedlem sedan jan. 20051 130 inlägg
#14

Peter S skrev:

$text = preg_replace('/<(p|span|div)(?: style="[^"]*")?>(?:\s|<br(\s*\/)?>)*<\/\\1>/i', '', $text);

Verkar funka bra, tack Peter!

salkciNMedlem sedan sep. 200619 inlägg
#15

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);
130 ms totalt · 3 externa anrop · v20260731065814-full.c74b5be1
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)