2 votes

Diviser le HTML en deux avec PHP

J'essaie de diviser une chaîne de texte en deux, en faisant attention de ne pas.. :

  • mots de rupture
  • rupture html

Pour vous donner un peu de contexte, je veux prendre un article de blog et injecter une publicité au milieu de celui-ci.

J'ai cherché une réponse mais les seules options que j'ai trouvées sur SO suggèrent de supprimer tout le HTML - ce qui n'est pas une option...

Exemple :

  $string = "<div class='some-class'>Deasdadlights blasdasde holysadsdto <span>Bri<img src='#'>cable holystone blow the man down</span></div>";
  $length = strlen($string);

  // At this point, something magical needs to split the string being mindful of word breaks and html
  $pieces = array(
    substr( $string, 0, ( $length / 2 ) ),
    substr( $string, ( $length / 2 ), $length )
  );

  echo $pieces[0] . " **Something** " . $pieces[1];

  // <div class="some-class">Deasdadlights blasdasde holysadsdto <spa **something**="" n="">Bri<img src="#">cable holystone blow the man down</spa></div>
  // And there goes the <span> tag :'(

UPDATE

Merci @Naga pour la réponse ! Voici une version un peu plus développée pour ceux qui en ont besoin :

$string = '
  <section class="post_content">
    <p>Often half the battle is ensuring you get the time to respond to your reviews, the other half is remembering that the customer is always right and you should proceed with caution.</p>
    <p>Some simple principles to keep in mind are to be <strong>positive</strong>, <strong>humble</strong>, <strong>helpful</strong>, and <strong>enthusiastic</strong>.</p>
    <p>Some simple principles to keep in mind are to be <strong>positive</strong>, <strong>humble</strong>, <strong>helpful</strong>, and <strong>enthusiastic</strong>.</p>
  </section>
  ';

  $dom = new DOMDocument();
  $dom->preserveWhiteSpace = false;
  libxml_use_internal_errors(true);
  $dom->loadHTML($string);  // $string is the block page full / part html       
  $xpath = new DOMXPath($dom);  
  $obj = $xpath->query('//section[@class="post_content"]'); // assume this is the container div that where you want to inject
  $nodes = $obj->item(0)->childNodes;
  $half = $nodes->length / 2;

  $i = 0;
  foreach( $nodes as $node ) {
    if ( $i === $half ) {
      echo "<div class='insert'></div>";
    }
    echo $node->ownerDocument->saveHTML($node);
    $i ++;
  }

2voto

Naga Points 2026

Le simple fait de diviser par la longueur de la chaîne de caractères perturbera la sortie html. Vous devez trouver le conteneur de l'endroit où vous voulez injecter l'annonce et compter les noeuds html enfants puis foreach les notes enfants pour reconstruire le html avec votre injection d'annonce après certains noeuds enfants.

Ex,

        $dom = new DOMDocument();
        $dom->preserveWhiteSpace = false;
        libxml_use_internal_errors(true);
        $dom->loadHTML($html);  // $html is the block page full / part html       
        $xpath = new DOMXPath($dom);  

        $obj = $xpath->query('//div[@class="content"]'); // div[@class="content"] - assume this is the container div that where you want to inject
        var_dump($obj); // you will get all the inner content
        echo $htmlString = $dom->saveHTML($obj->item(0));  // you will have all the inner html
        // after this count the all child nodes and inject your advert and reconstruct render the page.

OU

de manière simple, trouvez une balise de texte constant au milieu du contenu HTML et remplacez la balise par votre injection + balise de texte constant.

Ex,

$cons = '<h3 class="heading">Some heading</h3>';
$inject = 'your advert html/text';
$string = str_replace = ($cons, $inject.$cons, $string);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X