2017-01-25 77 views
2

我想劈成两半的文本字符串,被铭记不:拆分HTML两种用PHP

  • 突破的话
  • 突破HTML

为了给你一个有点背景,我想写一篇博客文章,并在它的中间插入广告。

我周围到处寻找一个答案,但唯一的选择,我可以找到SO建议剥离所有HTML - 这是不是一个选项...

例子:

$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

感谢@Naga的回答!对于需要它的人来说,这是一个稍微更加扩展的版本:

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

回答

2

只是按字符串长度拆分会混淆输出html。你需要找到你想要注入广告的容器,然后计算子节点的html节点,然后在子节点之后通过广告注入重新构建html子注释。

防爆,

 $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. 

OR

以简单的方式

,发现在HTML内容的中间恒定的文本标签,并替换为您注射+不变文本标签的标签。

防爆,

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