Vous n'êtes pas identifié(e).

  • Contributions :
  • Vos boîtes de messages privés sont vides.

Annonce

Participez au Concours Seo 2016 Officiel ! | Faites un bond en avant avec la formation SEO Ranking Skills le 12 Avril 2017

#1 2016-01-24 09:28:35

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

[Question PHP] Modifier html à la volée avec Simple HTML DOM

Salut,

j'utilise la classe simple_html_dom.php depuis un moment pour faire du scrapping, mais aujourd'hui je rencontre une limite. Je suis presque certain qu'il y a une solution

En récupérant le dom de n'importe quelle page, on peut par exemple extraire la valeur de tous les H2 ainsi

include('simple_html_dom.php');
$html = new simple_html_dom();
$html = file_get_html('http://www.site-web.com');
foreach ($html->find('h2') as $h2) {
echo $h2->plaintext.'<br/>';
}

Jusque là très bien, mais supposez que je veuille garder le dom original tel quel, à la différence que je veux remplacer toutes les valeurs des balises h2 par "Hello World".

D'après ce que j'ai lu il suffit de faire ça


include('simple_html_dom.php');
$html = new simple_html_dom();
$html = file_get_html('http://www.site-web.com');
foreach ($html->find('h2') as $h2) {
$h2->plaintext = 'hello world';
}

Sauf que si je ne m'abuse, les nouvelles valeurs n'affectent pas le dom original. En effet si j'explore le dom à nouveau, je me rends compte qu'il n'a pas changé et je retrouve les valeurs d'origine des h2.

Normalement cela doit être tout à fait possible de faire ça avec cette classe, c'est certainement moi qui l'utilise mal. Est-ce que quelqu'un peu éclairer ma lanterne ?

Merci d'avance pour vos contribs smile


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#2 2016-01-24 09:42:49

Mention NicolasWeb
Soldier
Lieu : Besançon (France)
Inscription : 2015-09-30
Messages : 407

Rédaction
Sémantique
Python
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

je pense que ton $h2 est une copie c'est pour cela que ça ne modifie pas.
je n'ai pas d'environnement PHP sous la main mais tu peux commencer par tenter de passer $h2 par référence en l'appelant &$h2 : http://php.net/manual/fr/language.references.pass.php

Mais vu que tu modifie le dom dans ta boucle foreach j'ai un doute que cela fonctionne comme cela...

Bon courage, je regarderai ça plus en détail demain si tu es toujours coincé wink


Mes tools SEO gratuits →SeoSoftwareNow.com  ∙ Me contacter

Hors ligne

#3 2016-01-24 12:31:50

Mention Soul
Soldier
Lieu : Annecy
Inscription : 2013-01-02
Messages : 535

PHP
Netlinking Auto
Advertising
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Si la solution du dessus ne marche pas, tu peux faire :

include('simple_html_dom.php');
$html = new simple_html_dom();
$html = file_get_html('http://www.site-web.com');
foreach ($html->find('h2') as $key => $h2) {
    $h2->plaintext = 'hello world';
    $html->find('h2', $key)->innertext = 'foo';
}

CeKwa ?

Hors ligne

#4 2016-01-24 13:46:13

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Soul a écrit :

Si la solution du dessus ne marche pas, tu peux faire :

include('simple_html_dom.php');
$html = new simple_html_dom();
$html = file_get_html('http://www.site-web.com');
foreach ($html->find('h2') as $key => $h2) {
    $h2->plaintext = 'hello world';
    $html->find('h2', $key)->innertext = 'foo';
}

Top ! ben oui, tu modifies direct l'objet, j'essaie de suite smile

Merci Soul smile


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#5 2016-01-24 17:48:53

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Merci Soul, ça marche très bien comme àa en modifiant l'objet avec la bonne clé. C'est la bonne piste pour moi.

Pour l'instant je me heurte à des problèmes un peu plus chauds, par exemple quand les tags incluent d'autres tags.

Si j'ai ça par exemple...

<p>Salut les <a href="file.html">amis</a></p>

Je dois réussir à remplacer par

<p>Coucou les <a href="file.html">potes</a>

Le tout sans savoir à l'avance si je vais manipuler des tag <li>,<p>,<h2>,<div>, etc.

je dois réussir à modifier


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#6 2016-01-24 17:56:58

Mention Jaffaar
Guardian
Lieu : Marseille
Inscription : 2012-06-01
Messages : 4 797

Développement PHP
Développement JS
Networking SEO
Social Engineering
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

avec ce que tu as deja tu detecte les sequences, tu prépare tes spins a coté, en regardant ce qui match entre tes sequences et ton dico, puis après c'est la toute la question.

des str replaces a partir des sequences de base comme facteur de detection ? assez sécurisé quand même, genre pas sur un mot ou deux, mais un groupe de sequence spinnée, du même element, interpreté et prete a être remplacante de la sequence de base.

Sinon recréer un nouveau dom et utilisant ce que tu ne va pas modifier de l'original, la lecture pour cela suffit, puis a la volée les partie que tu souhaite spinner tu les traite.

Je ferai comme ca perso je pense.


⌕ Tu veux Ranker ?
⏩ Actives le mode automatique avec SEO Quartz
⏩ Découvres l' ebook Architecture SEO
⏩ Trouves la formation SEO Ranking Skills dans Google

Hors ligne

#7 2016-01-24 18:02:15

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Jaffaar... j'ai capté quetchi ! big_smile

Mais qu'est ce qui te fait croire que je veux faire du content spinning ?


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#8 2016-01-24 18:27:10

Mention Jaffaar
Guardian
Lieu : Marseille
Inscription : 2012-06-01
Messages : 4 797

Développement PHP
Développement JS
Networking SEO
Social Engineering
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Bigorno a écrit :

Jaffaar... j'ai capté quetchi ! big_smile

Mais qu'est ce qui te fait croire que je veux faire du content spinning ?

Oh trois fois rien , on en parle sur skype smile


⌕ Tu veux Ranker ?
⏩ Actives le mode automatique avec SEO Quartz
⏩ Découvres l' ebook Architecture SEO
⏩ Trouves la formation SEO Ranking Skills dans Google

Hors ligne

#9 2016-01-24 19:12:47

Mention Soul
Soldier
Lieu : Annecy
Inscription : 2013-01-02
Messages : 535

PHP
Netlinking Auto
Advertising
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Ça ressemble à quoi ta chaîne d'entrée ?

Si ta "Salut les" => "Coucou les", tu fais un str_replace(">Salut les<",  ">Coucou les<") mais je suis pas sur de comprendre ce que tu veux.


CeKwa ?

Hors ligne

#10 2016-01-24 19:24:01

Mention Mitsu
Soldier
Inscription : 2014-11-17
Messages : 1 738

Développement PHP
Développement JS
Audit et Analyse
Netlinking
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Pour gérer le problème des tags, il faudrait que tu fasses des replace avec des regex, j'aime pas trop utiliser ces conneries mais bon dans l'idée si tu fais un replace de "Salut{regex}les{regex}potes"
par "Coucou{regex}les{regex}amis" avec une regex qui tolère les espaces, virgules et tag <.*> etc...
Je ne sais pas si ça répond à ta question pour le coup. Mais bon ça nécessiterai plutôt de traiter ta page en mode chaîne de caractère plutôt que comme du dom.


Mitsu, un Expert SEO qui se fait une joie de partager ses délires sur internet...

Hors ligne

#11 2016-01-28 11:10:34

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Merci pour vos réponses, je clarifie un peu le besoin

je récupère un dom complet d'une page web quelconque. J'ai besoin de spiner le contenu (j'ai déjà un dico interne), tout en gardant le dom intact, sauf que le spin peut potentiellement casser mon dom, voilà un exemple

supposons que dans un morceau du dom j'ai <a href="referencement.html">référencement</a> et que mon spin effectue un remplacement du mot "référencement" par "SEO", je me retrouve avec <a href="SEO.html">SEO</a> ce qui ne va pas du tout pour moi.

C'est pour ça que plutôt que de travailler sur le html comme une chaine de caractère j'envisage de manipuler l'objet dom


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#12 2016-01-28 11:21:02

Mention Woods
Soldier
Inscription : 2013-10-25
Messages : 260

Netlinking
Networking SEO
Automatisation Web
Scraping

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Je te propose ce que j'aurais fait instinctivement, ce n'est peut être pas la solution la plus simple ni celle qui pompe le moins de mémoire.

<a href="referencement.html">référencement</a>

je fais une regex qui prend ce qu'il y a entre les balises et y compris "<" et ">", je stock dans un tableau, par ex:

tab[0] = "<a href="referencement.html">";
tab[1] = "</a>";

Et je fais un str_replace($tab[0], "%chaine0%", $source);
...

les termes tels que %chaine0%, %chaine1% ne sont pas dans ton dico donc ils ne seront pas touchés.

Puis une fois que ton contenu est spinné, tu fais ré apparaître tes liens intact.

Je suis à côté de la plaque ça se trouve lol

Aussi, je stockerais chaque type de balise (p, div, ...) dans un tableau puis foreach et si on tombe sur une balise <a href on fait ceci... sinon si on tombe sur ...

Dernière modification par Woods (2016-01-28 11:24:31)


Blog de consultant SEO - Skype : Woods.cpa - @Woods_seo

Hors ligne

#13 2016-01-28 11:50:57

Mention Jaffaar
Guardian
Lieu : Marseille
Inscription : 2012-06-01
Messages : 4 797

Développement PHP
Développement JS
Networking SEO
Social Engineering
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

tu codes maintenant woods ?


⌕ Tu veux Ranker ?
⏩ Actives le mode automatique avec SEO Quartz
⏩ Découvres l' ebook Architecture SEO
⏩ Trouves la formation SEO Ranking Skills dans Google

Hors ligne

#14 2016-01-28 12:11:06

Mention Woods
Soldier
Inscription : 2013-10-25
Messages : 260

Netlinking
Networking SEO
Automatisation Web
Scraping

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Jaffaar a écrit :

tu codes maintenant woods ?

J'ai toujours codé Jaff tongue, juste que c'est pour des besoins spécifiques, jamais de gros projets.
Rarement lisible et compréhensible mais le principal c'est que j'arrive à combler mon besoin lol


Blog de consultant SEO - Skype : Woods.cpa - @Woods_seo

Hors ligne

#15 2016-01-28 13:00:34

Mention Jaffaar
Guardian
Lieu : Marseille
Inscription : 2012-06-01
Messages : 4 797

Développement PHP
Développement JS
Networking SEO
Social Engineering
Site Web

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

content de l'apprendre smile


⌕ Tu veux Ranker ?
⏩ Actives le mode automatique avec SEO Quartz
⏩ Découvres l' ebook Architecture SEO
⏩ Trouves la formation SEO Ranking Skills dans Google

Hors ligne

#16 2016-02-02 14:30:47

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Après quelques galères voici un code qui fonctionne pour évoluer dans l'objet dom et modifier les valeurs ou attributs des éléments à la volée.

J'ai ajouté des flags "[protected] $var[/protected]" dans le code pour m'assurer que j'isole bien les éléments indépendamment  des autres, pour pouvoir aussi faire des modif sur les éléments "parent" sans casser les modif éventuellement effectuées sur des éléments "enfant". En fonction de ce que vous voulez faire il suffit de manipuler $var


include ('simple_html_dom.php');
$page = file_get_contents('http://www.ndd.com');
    $html = new simple_html_dom();
    $html = str_get_html($page);
    parse($html);
    echo $html;

    function parse($html){
      foreach($html->find('*') as $key => $tag){
        $array = $tag->children(-1);
        if ($array){
          parse($tag);
          if(preg_match('#\[\/protected\]#',$tag->innertext) && $tag->tag!='img'){
   
            $string = str_replace('[/protected]','[/protected]***',strip_tags($tag->innertext));
            $tab = explode('***',$string);       
            foreach($tab as $match){
              $match = preg_replace('#\[protected\](.*)\[\/protected\]#','',$match);
              if(preg_match('#[a-z]{2,}#U',$match)){
                $new_val = '[protected]'.$match.'[/protected]';
                $tag->innertext = str_replace($match,$new_val,$tag->innertext);
              }
            }
          }
          else {
            if($tag->tag!='img' && preg_match('#[a-z]{2,}#i',$tag->plaintext))
            $tag->innertext = '[protected]'.$tag->innertext.'[/protected]';
          }
        }
        else {
          if($tag->tag!='img' && preg_match('#[a-z]{2,}#i',$tag->plaintext))
          $tag->innertext = '[protected]'.$tag->innertext.'[/protected]';
        }
      }
    }
 

N'hésitez pas si vous voyez des erreurs dans le code, je l'ai utilisé à plusieurs reprises sans erreurs pour le moment


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#17 2016-02-16 09:33:12

Mention ciboulette
Soldier
Inscription : 2015-11-01
Messages : 278

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM


<?php
$doc = new DOMDocument;
@$doc->loadHTMLFile('http://www.lightonseo.com/');
$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//text()');
foreach ($nodes as $node) {
    $node->nodeValue = str_replace("SEO", "Bigorno", $node->nodeValue);
}

echo $doc->saveHTML();
 

Sinon comme ça
bon apres le str_replace tu mets ce que tu veux a la place biensur

Hors ligne

#18 2016-02-16 10:25:40

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

ciboulette a écrit :

<?php
$doc = new DOMDocument;
@$doc->loadHTMLFile('http://www.lightonseo.com/');
$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//text()');
foreach ($nodes as $node) {
    $node->nodeValue = str_replace("SEO", "Bigorno", $node->nodeValue);
}

echo $doc->saveHTML();
 

Sinon comme ça
bon apres le str_replace tu mets ce que tu veux a la place biensur

Alors le code que j'ai posté marche très bien, par contre le tiens à l'air bien frais smile

Je vais regarder ça, mais elle fait quoi exactement la methode query('//text()') ? J'ai pas encore maté la doc

J'ai jamais utilisé DOMDocument pour l'instant, mais ce qui est rassurant avec c'est que c'est maintenu et dans la doc php, contrairement à la classe simple_html_dom (qui fonctionne aujourd'hui) mais qui n'est plus du tout maintenue


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#19 2016-02-17 10:31:34

Mention ciboulette
Soldier
Inscription : 2015-11-01
Messages : 278

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

texte ba ça selectionne le texte uniquement entre les balises.
d'ailleur le code prendra le javascript


$nodes = $xpath->query('/html/body//text()');
 

la ça ne prendra uniquement que le contenu du body.

Ce qui est cool et rapide avec xpath en plus c'est que si tu veut allez vite :
1/Tu va sur ton site (example le tien)
2/ clic droit inspecté élément
3/ Dans le code source tu fait clique droit sur la zone (genre <p></p>) qui t’intéresse
4/ Copy -> Copy Xpath (//*[@id="post-1227"]/div[2]/p)
5/ Tu modifie ton bout de code  : $nodes = $xpath->query('//*[@id="post-1227"]/div[2]/p//text()');

et voila en 3 clique tu peu ciblé une zone précises sachant que le * reste ton meilleur amis : tu peu faire : $nodes = $xpath->query('//*[@id="post-*"]/div[2]/p//text()');

donc prendre uniquement les Posts de la page

Hors ligne

#20 2016-02-17 10:57:38

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

ciboulette a écrit :

texte ba ça selectionne le texte uniquement entre les balises.
d'ailleur le code prendra le javascript


$nodes = $xpath->query('/html/body//text()');
 

la ça ne prendra uniquement que le contenu du body.

Ce qui est cool et rapide avec xpath en plus c'est que si tu veut allez vite :
1/Tu va sur ton site (example le tien)
2/ clic droit inspecté élément
3/ Dans le code source tu fait clique droit sur la zone (genre <p></p>) qui t’intéresse
4/ Copy -> Copy Xpath (//*[@id="post-1227"]/div[2]/p)
5/ Tu modifie ton bout de code  : $nodes = $xpath->query('//*[@id="post-1227"]/div[2]/p//text()');

et voila en 3 clique tu peu ciblé une zone précises sachant que le * reste ton meilleur amis : tu peu faire : $nodes = $xpath->query('//*[@id="post-*"]/div[2]/p//text()');

donc prendre uniquement les Posts de la page

Oui mais non smile

Si tu lis bien le thread, le besoin était d'explorer tous les noeuds sans connaître à l'avance le site sur lequel tu opères. Quand il s'agit d'un site que tu connais pas de souci.

Le problème avec ça :


$nodes = $xpath->query('/html/body//text()');
 

est que je vais récupérer un full text qui dans mon cas est inutile, j'avais besoin de préserver tout le code html de la page. La solution devait pouvoir boucler sur tous les noeuds du dom et être efficace même sur les cas particuliers. Je te donne deux exemples


<strong><a href="test.html">mon super test</a></strong>
 

Si je demande a un parser de me filer les plaintext de toutes les balises html, il va me filer "mon super test" deux foix : 1 fois pour <strong> et une fois pour <a>. Or dans l'exemple ci-dessus j'ai besoin qu'il ignore le strong. Voici un autre cas plus chiant.


<p>Bonjour à tous, <strong>la météo est <a href="test.html">clémente</a> depuis quelque jours</strong>. Nous pourrions <strong>envisager</strong> une sortie.
 

Si je veux spinner le contenu de la balise p, j'ai du découper et spinner les zones qui ne contiennent pas de tag enfants :

*** Bonjour à tous
*** Nous pourrions
*** Une sortie

Ensuite j'ai du spinner le contenu des tags enfants avec le même besoin de vérifier si eux mêmes n'avaient pas de tag enfants. Pour les balises strong par exemple

*** la meteo est
*** depuis quelques jours
*** envisager

Je voulais aussi éviter les regex, parce que c'est chiant et pour éviter des soucis à cause d'erreurs html


Le fait est que j'ai réussi à le faire avec du parsing, ç'est gourmand en mémoire mais ça marche. Bien sûr je suis ouvert à toute alternative ou méthode différente plus simple ou qui ferait gagner du temps wink


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#21 2016-02-17 11:58:35

Mention DevForEver
Recruit
Inscription : 2016-02-16
Messages : 51

PHP
JAVA
DB Admin
Sécurité

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

include('simple_html_dom.php');
$html = new simple_html_dom();
$html = file_get_html('http://www.site-web.com');
foreach ($html->find('h2') as $h2) {
$h2->plaintext = 'hello world';
}

Sauf que si je ne m'abuse, les nouvelles valeurs n'affectent pas le dom original. En effet si j'explore le dom à nouveau, je me rends compte qu'il n'a pas changé et je retrouve les valeurs d'origine des h2.

Info: foreach est un itérateur en lecteur seule, il n'est pas possible de modifier la valeur de $h2. Pour rendre $h2 modifiable, il convient de définir la boucle ainsi: foreach ($html->find('h2') as &$h2)

Si la méthode avec xpath marche, touche à rien big_smile

Si vraiment, tu veux rendre le script moins gourmand la solution est de parcourir qu'une seule fois l'ensemble du code HTML (xPath parcourt l'ensemble de caractère à chaque fois) et de de faire les remplacements à la volée.

Pour ce faire, une solution est de parcourir le code HTML, détecter les zones à remplacer, copier ce qui ne change pas, insérer le nouveau contenu et ainsi de suite.
Au final, on se retrouve avec le code HTML original et un code HTML où les textes ont été remplacés.

Hors ligne

#22 2016-02-17 12:15:44

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

DevForEver a écrit :

Info: foreach est un itérateur en lecteur seule, il n'est pas possible de modifier la valeur de $h2. Pour rendre $h2 modifiable, il convient de définir la boucle ainsi: foreach ($html->find('h2') as &$h2)

tu utilises vraiment simple html dom ? cela marche très bien avec  foreach ($html->find('h2') as $h2){}

Le problème est la méthode appelée dans le foreach, pas le foreach lui même. $h2->plaintext() ne changera pas l'objet dom $html par contre avec $h2->innertext = 'hello world'; Le dom $html est bel et bien modifié, même dans un foreach.

Je ne vois pas ce que tu veux dire par un itérateur en lecture seule, pour moi c'est un itérateur point. En effet tu peux modifier toutes les valeurs d'un array en passant par un foreach. Du coup je ne comprends pas ce que tu as voulu dire.

DevForEver a écrit :

Si vraiment, tu veux rendre le script moins gourmand la solution est de parcourir qu'une seule fois l'ensemble du code HTML (xPath parcourt l'ensemble de caractère à chaque fois) et de de faire les remplacements à la volée.

C'est exactement ce que je fais, je ne parcours qu'une seule fois chaque noeud de de l'objet simple_html_dom

DevForEver a écrit :

Pour ce faire, une solution est de parcourir le code HTML, détecter les zones à remplacer, copier ce qui ne change pas, insérer le nouveau contenu et ainsi de suite.

Comment faire ça était effectivement le problème à résoudre smile


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#23 2016-02-17 13:48:46

Mention ciboulette
Soldier
Inscription : 2015-11-01
Messages : 278

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

moi sur le site de Bigorno avec un replace de SEO par Bigorno le script d'execute en :

1 fois en 0.798 sec  sur un PHP5.
10 fois 6.088 sec sur un PHP5

1 fois en 0.698 sec sur un PHP7
10 fois en 6.011 sec sur un PHP7

sur la page WIKI (https://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche) avec un replace de SEO par Bigorno le script d'execute en :

1 fois en 0.114 sec sur un PHP5
10 fois en 0.964 sec sur un PHP5

1 fois en  0.104 sec sur un PHP7
10 fois en 1.015 sec sur un PHP7

ce qu'on peu voir donc la c'est que le script n'est pas forcement gourmand mais c'est plutôt la vitesse du serveur en face qui va jouer ...

Ma version de test :

<?php
$timestart=microtime(true);
$output = array();
$total_execute = 10;


for ($i = 1; $i <= $total_execute; $i++) {
   
    $doc = new DOMDocument;
    @$doc->loadHTMLFile('https://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche');
    $xpath = new DOMXPath($doc);
    $nodes = $xpath->query('//text()');
    foreach ($nodes as $node) {
      $node->nodeValue = str_replace("SEO", "Bigorno", $node->nodeValue);
    }

    $output[] = $doc->saveHTML();
}

echo "<br>Script execute en " . number_format((microtime(true)-$timestart), 3) . " sec";
 

Apres oui le script peu etre plus gourmand selon la fonction de SPIN utilisé smile, mais je sais pas le debit que tu demande

Hors ligne

#24 2016-02-17 14:23:47

Mention Walid
Soldier
Inscription : 2013-02-07
Messages : 1 927

Sémantique
Audit et Analyse
Netlinking
PHP

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

ciboulette a écrit :

moi sur le site de Bigorno avec un replace de SEO par Bigorno le script d'execute en :

1 fois en 0.798 sec  sur un PHP5.
10 fois 6.088 sec sur un PHP5

1 fois en 0.698 sec sur un PHP7
10 fois en 6.011 sec sur un PHP7

sur la page WIKI (https://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche) avec un replace de SEO par Bigorno le script d'execute en :

1 fois en 0.114 sec sur un PHP5
10 fois en 0.964 sec sur un PHP5

1 fois en  0.104 sec sur un PHP7
10 fois en 1.015 sec sur un PHP7

ce qu'on peu voir donc la c'est que le script n'est pas forcement gourmand mais c'est plutôt la vitesse du serveur en face qui va jouer ...

Ma version de test :

<?php
$timestart=microtime(true);
$output = array();
$total_execute = 10;


for ($i = 1; $i <= $total_execute; $i++) {
   
    $doc = new DOMDocument;
    @$doc->loadHTMLFile('https://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche');
    $xpath = new DOMXPath($doc);
    $nodes = $xpath->query('//text()');
    foreach ($nodes as $node) {
      $node->nodeValue = str_replace("SEO", "Bigorno", $node->nodeValue);
    }

    $output[] = $doc->saveHTML();
}

echo "<br>Script execute en " . number_format((microtime(true)-$timestart), 3) . " sec";
 

Apres oui le script peu etre plus gourmand selon la fonction de SPIN utilisé smile, mais je sais pas le debit que tu demande

On s'est pas compris, je disais pas que ton script était gourmand, le mien aussi traverse le dom, et quoi qu'il arrive c'est une méthode gourmande, bien optimiser la méthode de parsing est essentiel.

Si cela t'intéresse relis les problématiques que j'ai posté plus haut tu constateras que ta fonction de replacement ne marchera pas dans le cas d'utilisation dont j'ai parlé.

Sincèrement, je ne connais pas bien la classe domNode mais d'après ce que je vois sur la doc $node->nodevalue va te donner le plain text de node en question, mais aussi celui de ces enfants. Donc si j'ai <p>Salut <strong>les dev</strong></p>, lorsque je vais agir le plaintext du node correspondant à la balise <p>, je vais agir sur "salut les dev" sauf que j'aurai perdu les <strong></strong>


= 'hello world' va agir


Le contenu textuel de ce noeud et de ces descendants.


Fatigué du SEO sans résultats ? Je te propose :

1 => Un vrai Road Map SEO - 2 => Une Optimisation aux petits oignons - 3 => Des Prestations de Trust Linking
Mon Id Skype : walid.gabteni - Mon site : Light On SEO

En ligne

#25 2016-02-17 14:41:44

Mention ciboulette
Soldier
Inscription : 2015-11-01
Messages : 278

Re : [Question PHP] Modifier html à la volée avec Simple HTML DOM

Bigorno a écrit :

Sincèrement, je ne connais pas bien la classe domNode mais d'après ce que je vois sur la doc $node->nodevalue va te donner le plain text de node en question, mais aussi celui de ces enfants. Donc si j'ai <p>Salut <strong>les dev</strong></p>, lorsque je vais agir le plaintext du node correspondant à la balise <p>, je vais agir sur "salut les dev" sauf que j'aurai perdu les <strong></strong>

Le contenu textuel de ce noeud et de ces descendants.

Non la preuve :

Fichier source : http://www.woozy.fr/source.html

url du test : http://www.woozy.fr/test.php


Code :


    $doc = new DOMDocument;
    @$doc->loadHTMLFile('http://www.woozy.fr/source.html');
    $xpath = new DOMXPath($doc);
    $nodes = $xpath->query('//text()');
    foreach ($nodes as $node) {
      $node->nodeValue = str_replace("dev", "Bigorno", $node->nodeValue);
$node->nodeValue = str_replace("Salut", "Coucou", $node->nodeValue);
    }

    $output =  $doc->saveHTML();

 

Dernière modification par ciboulette (2016-02-17 15:45:53)

Hors ligne

Pied de page des forums