Убрать пустые пары spanов

Raziel[SD]

untitled00
Убрать пустые пары spanов

как в таком тексте:
<SPAN>TEST TEXT <SPAN class="colored">COLORED</SPAN><SPAN> NEXT</SPAN> TEXT</SPAN>
при помощи регулярных выражений вырезать все пустые(у которых нет аттрибутов) пары SPANов, т.е. должно остаться
TEST TEXT <SPAN class="colored">COLORED</SPAN>NEXT TEXT
 

Quidle

Полноценный новичок
А зачем тебе здесь регулярные выражения ?
Сделай всё substr-ами и strpos-ами
 

Raziel[SD]

untitled00
Quidle мне кажется, что регулярными выражениями будет быстрее, и вообще интересно как, если это возможно.
 

гоша

Guest
одним выражением сложновато, поскольку надо учитывать вложенность тегов.

Я бы сделал так:

PHP:
$html=preg_replace_callback("~<(/)?span(.*?)>~i","remove",$html);

function remove($m){
	static $stack=array();
	if(strlen($m[1]))
		return array_pop($stack) ? $m[0] : "";
	else 
		return ($stack[]=strlen(trim($m[2]))) ? $m[0] : "";
}
было бы, однако, интересно увидеть всё-таки одно выражение, если кто додумается.
 

Raziel[SD]

untitled00
гоша спасибо, хотя если есть способ в одно выражение, мне тоже хотелось бы его увидеть.
 

NetKot

Guest
зато одним

Автор оригинала: Raziel[SD]
гоша спасибо, хотя если есть способ в одно выражение, мне тоже хотелось бы его увидеть.
Если уж очень охота удалить одним выражением, то можно попробовать так:

PHP:
$text = preg_replace ("~<span>((?:[^<]|<[^s/]|<s[^p]|<sp[^a]|<spa[^n]|<span[^\s>]|</[^s]|</s[^p]|</sp[^a]|</spa[^n]|</span[^\s>])*)</span>~i", '\1', $text);
криво, неуневерсально, зато одним регекспом :)

update: хотя работает на внутренних тегах только, не вник в задание
 
Сверху