2012-02-22 34 views
2

我有以下php函数应该根据给定的类名或id去除一块html标记。我得到这个功能http://www.katcode.com/php-html-parsing-extracting-and-removing-html-tag-of-specific-class-from-string/剥离基于类或id的整个HTML块用php

这个函数的工作原理应该是这样,但是当我们有嵌套标签时似乎有问题。在下面的例子中,我试图删除整个div类的'两'类。

此功能似乎有嵌套标签的问题。这不是正确地移除div区块。计算块的开始和结束时遇到问题。我该如何重写这个函数,而不管它包含多少个嵌套元素。我打开其他PHP的建议。我可以用jQuery轻松做到这一点,但我正在寻找一个php服务器端解决方案。

HTML看起来像这样

<div class="test"> 
    <div>testing1</div> 
    <div class="two"> 
     <div>testing3</div> 
     <div>testing3</div> 
    </div> 
    <div>testing3</div> 
    <div>testing4</div> 
</div> 

PHP

<?php 
$x = '<div class="test"><div>testing1</div><div class="two"><div>testing3</div><div>testing3</div></div><div>testing3</div><div>testing4</div></div>'; 

    function removeTag($str,$id,$start_tag,$end_tag){ 
      while(($pos_srch = strpos($str,$id))!==false){ 
       $beg = substr($str,0,$pos_srch); 
       $pos_start_tag = strrpos($beg,$start_tag); 
       $beg = substr($beg,0,$pos_start_tag); 
       $end = substr($str,$pos_srch); 
       $end_tag_len = strlen($end_tag); 
       $pos_end_tag = strpos($end,$end_tag); 
       $end = substr($end,$pos_end_tag+$end_tag_len); 
       $str = $beg.$end; 
      } 
      return $str; 
    } 

echo removeTag($x,'two','<div','/div>'); 
?> 
+0

我的回答不够好​​,不能作为“答案”,但我会指出你的方向。我看到人们用DOM和Xpath完成这样的事情。 – TecBrat 2012-02-22 03:29:13

+0

谢谢,但这并不能帮助我。 – Pinkie 2012-02-22 03:31:46

+0

使用解析器是解析HTML的唯一正确方法...不是正则表达式,不是字符串函数。这就是为什么你有麻烦。就像@TecBrat所说的,你需要使用'DOM'。尝试使其与它一起工作,如果您遇到问题,请发布新的(或更新的)问题。 – rdlowrey 2012-02-22 03:41:52

回答

0

未经测试,但你可以试试:

 

$doc = new DOMDocument(); 
$doc->loadHTML($x); 
$xpath = new DOMXPath($doc); 
$query = "//div[contains(@class, 'two')]"; 
$oldnodes = $xpath->query($query); 

foreach ($oldnodes as $node) { 
    $fragment = $doc->createDocumentFragment(); 
    while($node->childNodes->length > 0) { 
     $fragment->appendChild($node->childNodes->item(0)); 
    } 
    $node->parentNode->replaceChild($fragment, $node); 
} 
echo $doc->saveHTML(); 
 

希望它可以帮助

+0

你测试过了吗?它不会剥离任何东西。 – Pinkie 2012-02-22 04:17:55

+0

@Pinkie你应该可以从那里弄清楚。 – dqhendricks 2012-02-22 04:48:50

-1

html应该可能永远不会用这种方式解析php。

使用phps domdocument类打开html作为对象。然后可以使用domdocument方法在文档中搜索要查找的块(xpath),循环访问xpath结果并将其删除,然后以文本形式重新保存文档。

+2

我认为你的Shift键坏了。 – rdlowrey 2012-02-22 04:00:52

+0

@rdlowrey iphone其实。谁想要在iPhone上使用shift。 – dqhendricks 2012-02-22 04:47:04