2017-01-25 3 views
2

Ich versuche, einen Text-String in zwei Hälften geteilt, aufmerksam zu sein, um nicht:Split HTML in zwei mit PHP

  • Pause Wörter
  • Pause html

Um Ihnen ein etwas Hintergrund, ich möchte einen Blog-Artikel nehmen und eine Anzeige in der Mitte davon spritzen.

Ich habe um eine Antwort gejagt, aber die einzigen Optionen finde ich auf SO vorschlagen alle HTML-Stripping - das ist keine Option ...

Beispiel:

$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

Vielen Dank @Naga für die Antwort! Hier ist eine etwas erweiterte Version für jeden, der es:

$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 ++; 
    } 

Antwort

2

einfach Spaltung von String-Länge verwirren die Ausgabe html. Sie müssen den Container finden, in den Sie die Anzeige einfügen möchten, und die untergeordneten HTML-Knoten zählen, um die untergeordneten Notizen zu rekonstruieren, um den HTML-Code mit der Anzeigeninjektion nach bestimmten untergeordneten Knoten zu rekonstruieren.

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. 

ODER

in einfacher Weise einen konstanten Text-Tag in der Mitte der HTML-Inhalte finden und den Tag mit der Injektion + konstantem Text-Tag ersetzen.

Ex,

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