Boş kaldırmak için düzenli ifade

7 Cevap php

Ben kaldırılacak (  ve uzay ile dolu) gibi boş span etiketleri istiyorum:

<span> &nbsp; &nbsp; &nbsp; </span>

Ben bu regex ile denedim, ama bu ayarlama ihtiyacı:

(<span>(&nbsp;|\s)*</span>)

preg_replace('#<span>(&nbsp;|\s)*</span>#si','<\\1>',$encoded);

7 Cevap

PHP Kent Fredric en regexpi çevriliyor:

preg_match_all('#<span[^>]*(?:/>|>(?:\s|&nbsp;)*</span>)#im', $html, $result);

Bu maç olacak:

  • açıklıklı Autoclosing
  • multilines üzerinde yayılan ve ne olursa olsun dava
  • özelliklere sahip açıklıklı
  • Kırılmaz boşluklarla yayılma

Belki sadece <br /> yanı açıklıklı containings dahil olmak üzere yaklaşık gerekir ...

Bu regexpi oynamak söz konusu olduğunda, her zamanki gibi, bazı araçlar kullanışlı:

http://regex.larsolavtorvik.com/

.

qr{<span[^>]*(/>|>\s*?</span>)}

Bunların özü almalısınız. (Dahil XML stil kendini kapanış etiketleri yani:)

Ancak really HTML işleme için regex kullanmak gerekir.

Answer only relevant to the context of the question that was visible before the formatting errors were corrected

I suppose these span are generated by some program, since they don't seem to have any attribute.
I am perplex why you need to put the space they enclose between angle brackets, but then again I don't know the final purpose of the code.
I think the solution is given by Kent: you have to make the match non-greedy: since you use dotall option (s), you will match everything between the first span and the last closing span!

Yani cevap gibi görünmelidir:

preg_replace('#<span>(&nbsp;|\s)*?</span>#si', '<$1>', $encoded);

(Denenmemiş)

Ben bu regex ile denedim, ama bu ayarlama ihtiyacı:

Ne şekilde orijinal söz regex başarısız?

The problem comes when the span gets nested like: <span><span> &nbsp; </span></span>

Bu HTML özellikle iyi çalışmıyor ayrıştırmak için Regexes kullanarak neden bir örnektir. Lütfen regex lezzet bağlı olarak, bu durum tek bir geçişte işlemek için imkansız ya da sadece çok zor belirtilebilir. Ben tek sorun iç <span> dışarı alır ve tek başına dış birini bırakır ise, bu hangi kategori içine düşüyor söylemek PHP'nin regex motoru yeterince iyi biliyorum, ama yok, o zaman isteyebilirsiniz Bu yapılacaklar biterse kadar sadece art arda ikamesini yeniden çalıştırmayı düşünün.

Tek sorun span etiketleri iç içe iseniz, çalıştırabilirsiniz arama ve değiştirme regex artık herhangi bir sonuç bulana kadar bir döngü var regex.

Bu çok zarif bir çözüm olmayabilir, ama yeterince iyi yaparız.

İşte yuvalama etiketleri sorunlarına benim çözüm hala tam değil ama yakın bir ...

$test="<span>   <span>& nbsp;  </span>	test <span>& nbsp; <span>& nbsp;  </span>  </span> & nbsp;& nbsp; </span>";

$pattern = '#<(\w+)[^>]*>(& nbsp;|\s)*</\1>#im';      
while(preg_match($pattern, $test, $matches, PREG_OFFSET_CAPTURE)!= 0)
{$test= preg_replace($pattern,'', $test);}

Kısa $ test cümleler için fonksiyon Tamam çalışır. Uzun bir metin ile çalışırken sorun gelir. Herhangi bir yardım takdir edilecektir ...

E-satis değiştirme 'biraz cevap:

function remove_empty_spans($html_replace)
{
$pattern = '/<span[^>]*(?:\/>|>(?:\s|&nbsp;)*<\/span>)/im';
return preg_replace($pattern, '', $html_replace);
}

Bu benim için çalıştı.