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
De l'aide?
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 = '';
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.
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;
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.
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
}
}
}
Cela fonctionne pour moi:
foreach($html->find('element') as $element){
$element = NULL;
}
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.