web-dev-qa-db-fra.com

Simple HTML Dom: Comment supprimer des éléments?

Je voudrais utiliser Simple HTML DOM pour supprimer toutes les images d'un article afin que je puisse facilement créer un petit extrait de texte pour un téléscripteur de nouvelles, mais je n'ai pas compris comment supprimer des éléments avec.

En gros je ferais

  1. Obtenir du contenu sous forme de chaîne HTML
  2. Supprimer toutes les balises d'image du contenu
  3. Limiter le contenu à x mots
  4. Production.

De l'aide?

36
kasakka

Il n'existe aucune méthode dédiée pour supprimer des éléments. Vous venez de trouver tous les éléments img et ensuite

$e->outertext = '';
51
Gordon

lorsque vous supprimez uniquement le texte externe, vous supprimez le contenu HTML lui-même, mais si vous effectuez une autre recherche sur les mêmes éléments, il apparaîtra dans le résultat. la raison en est que le simple objet HTML DOM a toujours sa structure interne de l'élément, uniquement sans son contenu réel. ce que vous devez faire pour vraiment supprimer l'élément est simplement de recharger le code HTML en tant que chaîne dans la même variable. de cette façon, l'objet sera recréé sans le contenu supprimé, et le simple objet HTML DOM sera construit sans lui.

voici un exemple de fonction:

public function removeNode($selector)
{
    foreach ($this->find($selector) as $node)
    {
        $node->outertext = '';
    }

    $this->load($this->save());        
}

mettez cette fonction dans la classe simple_html_dom et vous êtes bon.

28
Dr. Reshef

Je pense que vous avez des difficultés parce que vous avez oublié d'enregistrer (sauvegarder l'arborescence DOM interne dans la chaîne).

Essaye ça:

$html = file_get_html("http://example.com");

foreach($html ->find('img') as $item) {
    $item->outertext = '';
    }

$html->save();

echo $html;
12
Sid

Je ne pouvais pas savoir où mettre la fonction, alors je viens de mettre les éléments suivants directement dans mon code:

$html->load($html->save());

Il verrouille essentiellement les modifications apportées dans la boucle for dans le code html ci-dessus.

4
JaseC

Les solutions supposées sont assez chères et pratiquement inutilisables dans une grande boucle ou un autre type de répétition.

Je préfère utiliser les "suppressions en douceur":

foreach($html->find('somecondition'),$item){
    if (somecheck) $item->setAttribute('softDelete', true); //<= set marker to check in further code
    $item->outertext='';


   foreach($foo as $bar){
       if(!baz->getAttribute('softDelete'){
           //do something 
        }
    }

}
2
marcelde

Cela fonctionne pour moi:

foreach($html->find('element') as $element){
   $element = NULL;
}
1
baniadams

Ajouter une nouvelle réponse depuis removeNode est certainement une meilleure façon de la supprimer:

$html->removeNode('img');

Cette méthode n'était probablement pas disponible lorsque la réponse acceptée a été cochée. Vous n'avez pas besoin de boucler le html pour trouver chacun, cela les supprimera.

0
FRECIA