Gå til innhold

Hvordan fjerne html-tags som er dobbelt opp?


Gjest Slettet-IHWlGMJn

Anbefalte innlegg

Gjest Slettet-IHWlGMJn

Heisann

 

Jeg har en database med en del rot jeg vil kjøre gjennom med litt php for å rydde litt.

 

Jeg har f.eks noen instanser av "<strong><strong>tekst</strong></strong>". Jeg vil gjerne kjøre en funksjon som fjerner alle slike doble tags. Slik at det i dette tilfellet ville blitt "<strong>tekst</strong>".

 

Kan jeg bruken en form for preg_replace? Eller vil ikke det fungere da jeg vil at dette skal fungere uavhengig av hvilken tag det måtte være? Har ikke veldig mye greie på regexp.

 

PS: Har ikke helt tenkt gjennom om det er ønskelig å også fjerne den indre tagen om f.eks dette skulle finnes "<strong>tekst<strong>tekst</strong></strong>", men jeg tror det er det.

Noen som vet om en grei måte å få dette til på?

Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet-IHWlGMJn

Det går jo selvsagt an om tagene er åpnet og lukket ved siden av hverandre, men er jo ikke akkurat veldig lettvint.

 

Og ja, som nevnt. Det vil ikke gå så himla bra med f.eks denne: "<strong>tekst<strong>tekst</strong></strong>"

Lenke til kommentar

function remove_nested_tags($tag, $text){

   preg_match_all('/<\/?'.$tag.'>/i', $text, $matches, PREG_OFFSET_CAPTURE|PREG_SET_ORDER);

   $tags_to_remove = array();
   $open_tags = array();

   $error_check = array();

   foreach($matches as $match){

       if($match[0][0] == '<'.$tag.'>'){
           $open_tags[] = $match[0];
           if(count($open_tags) > 1)
               $tags_to_remove[] = $match[0];
       }else{
           if(count($open_tags) > 1)
               $tags_to_remove[] = $match[0];
           array_pop($open_tags);
       }
       $error_check[] = strtolower($match[0][0]);
   }
   $error_check = array_count_values($error_check);

   if($error_check['<'.$tag.'>'] != $error_check['</'.$tag.'>'])
       throw new Exception;

   $offset = 0;
   foreach($tags_to_remove as $match){
       $text = substr_replace($text, '', $match[1] - $offset, strlen($match[0]));
       $offset += strlen($match[0]);
   }
   return $text;
}

$text = '<strong>tekst<strong>tekst</strong></strong>';
echo remove_nested_tags('strong', $text) ."\n";

 

 

Har ikke testet det så mye, men jeg tror det fungerer.

Lenke til kommentar

Det går jo selvsagt an om tagene er åpnet og lukket ved siden av hverandre, men er jo ikke akkurat veldig lettvint.

 

Og ja, som nevnt. Det vil ikke gå så himla bra med f.eks denne: "<strong>tekst<strong>tekst</strong></strong>"

 

jo det er relativt greit.

med den siste kombinasjonen som du nevner så var du ikke helt sikker på om du skulle fjerne det virka det som... eller?

 

håper FraXinus hjelper deg...

Lenke til kommentar
  • 2 uker senere...
Gjest Slettet-IHWlGMJn

Har ikke testet det så mye, men jeg tror det fungerer.

Har ikke testet den noe særlig, men koden ser høyst rimelig ut :) Takker.

 

 

jo det er relativt greit.

med den siste kombinasjonen som du nevner så var du ikke helt sikker på om du skulle fjerne det virka det som... eller?

 

håper FraXinus hjelper deg...

Jeg er 99% sikker på at det er ønskelig for alle tags, i mitt tilfelle. Men det er i alle fall ønskelig for en tag som strong

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...