[PHP] strip specifiek nested div

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor een webpagina moet ik een stuk code tussen een specifieke div tag vervangen door andere code.
De pagina is extern, dus ik laad hem met file_get_contents. Vervolgens bewerk ik de string met de volgende functie:

PHP:
1
2
3
4
5
6
7
function strip_selected_tags_by_id_or_class($array_of_id_or_class, $text)
{
   $name = implode('|', $array_of_id_or_class);
   $regex = '#<(\w+)\s[^>]*(class|id)\s*=\s*[\'"](' . $name .
            ')[\'"][^>]*>.*</\\1>#isU';
   return(preg_replace($regex, '', $text));
}


Deze functie werkt prima, maar met nested tags niet, zie bijvoorbeeld voorbeeld 1:
HTML:
1
2
3
4
5
<div id="to_remove">&nbsp;</div>
<div id="retain">Do Not Remove</div>
<a class="to_remove">Remove</a><br/>
<div class="to_retain">This</div>
<input onclick="remove this;"/>

resultaat OK:
HTML:
1
2
3
<div id="retain">Do Not Remove</div>
<div class="to_retain">This</div>
<input onclick="remove this;"/>


Voorbeeld 2 met nested div tags werkt niet:
HTML:
1
2
3
4
<div id="to_remove">&nbsp;
<div id="retain">Do Not Remove<div>remove A</div><div>remove B</div></div>
<div class="to_retain">This</div>
<input onclick="remove this;"/>

resultaat:
HTML:
1
2
3
<div>remove B</div></div>
<div class="to_retain">This</div>
<input onclick="remove this;"/>


Ik heb het antwoord nog niet kunnen vinden. Hoe moet ik de regex aanpassen zodat de nested tags ook worden verwijdert?

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Wellicht niet de oplossing waar je naar zoekt, maar is de Tidy library niet veel handiger voor je? :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Ik gebruik sinds kort PHP Simple HTML DOM Parser voor dit soort dingen, het is misschien een beetje overkill voor een enkele vervangfunctie, maar het werkt wel heel erg makkelijk voor dit soort dingen, vooral als je meerdere bewerkingen op een HTML-document wilt uitvoeren.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Ja, ik kan je aanraden om inderdaad de DOM te parsen met een goede HTML-parser, dat aan te passen en weer te outputten. Die code zal ook een stuk duidelijker zijn en snel genoeg. Met regexes zal het waarschijnlijk altijd geklooi blijven (maar wellicht wel iets sneller).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wauw, wat een snelle reacties!!! _/-\o_

Ik ga ermee aan de slag, thanks! :)