21

私は次のhtmlを持っています:

<html>
 <body>
 bla bla bla bla
  <div id="myDiv"> 
         more text
      <div id="anotherDiv">
           And even more text
      </div>
  </div>

  bla bla bla
 </body>
</html>

<div id="anotherDiv">から終了までのすべてを削除したい<div>。それ、どうやったら出来るの?

4

7 に答える 7

34

ネイティブ DOMを使用

$dom = new DOMDocument;
$dom->loadHTML($htmlString);
$xPath = new DOMXPath($dom);
$nodes = $xPath->query('//*[@id="anotherDiv"]');
if($nodes->item(0)) {
    $nodes->item(0)->parentNode->removeChild($nodes->item(0));
}
echo $dom->saveHTML();
于 2010-07-22T12:10:00.807 に答える
14

preg_replace()次のように使用できます。

$string = preg_replace('/<div id="someid"[^>]+\>/i', "", $string);
于 2010-07-22T12:00:57.387 に答える
5

ネイティブXML 操作ライブラリの使用

HTML コンテンツが変数 $html に格納されていると仮定します。

$html='<html>
 <body>
 bla bla bla bla
  <div id="myDiv"> 
         more text
      <div id="anotherDiv">
           And even more text
      </div>
  </div>

  bla bla bla
 </body>
</html>';

ID でタグを削除するには、次のコードを使用します。

    $dom=new DOMDocument;

    $dom->validateOnParse = false;

    $dom->loadHTML( $html );

    // get the tag

    $div = $dom->getElementById('anotherDiv');

   // delete the tag

    if( $div && $div->nodeType==XML_ELEMENT_NODE ){

        $div->parentNode->removeChild( $div );
    }

    echo $dom->saveHTML();

の特定のバージョンでは、メソッドを使用するために が存在するlibxml必要があることに注意してください。doctypegetElementById

その場合、 $html を先頭に追加できます<!doctype>

$html = '<!doctype>' . $html;

または、ゴードンの回答で示唆されているようDOMXPathに、xpath を使用して要素を見つけるために使用できます。

$dom=new DOMDocument;

$dom->validateOnParse = false;

$dom->loadHTML( $html );

$xp=new DOMXPath( $dom );

$col = $xp->query( '//div[ @id="anotherDiv" ]' );

if( !empty( $col ) ){

    foreach( $col as $node ){

        $node->parentNode->removeChild( $node );

    }

}

echo $dom->saveHTML();

最初の方法は、タグに関係なく機能します。同じ ID で別のタグを持つ 2 番目のメソッドを使用する場合、たとえばを ' 'にform置き換えるだけです。//div//div[ @id="anotherDiv" ]//form

于 2015-07-13T10:09:35.400 に答える
0

strip_tags() 関数が探しているものです。

http://us.php.net/manual/en/function.strip-tags.php

于 2010-07-22T12:01:13.940 に答える
-1

特定のタグと属性を取り除くためにこれらを書きました。それらは正規表現であるため、すべての場合で100%動作することが保証されているわけではありませんが、私にとっては公正なトレードオフでした:

// Strips only the given tags in the given HTML string.
function strip_tags_blacklist($html, $tags) {
    foreach ($tags as $tag) {
        $regex = '#<\s*' . $tag . '[^>]*>.*?<\s*/\s*'. $tag . '>#msi';
        $html = preg_replace($regex, '', $html);
    }
    return $html;
}

// Strips the given attributes found in the given HTML string.
function strip_attributes($html, $atts) {
    foreach ($atts as $att) {
        $regex = '#\b' . $att . '\b(\s*=\s*[\'"][^\'"]*[\'"])?(?=[^<]*>)#msi';
        $html = preg_replace($regex, '', $html);
    }
    return $html;
}
于 2016-05-02T11:42:57.300 に答える
-1

を使用した RafaSashi の回答に続いpreg_replace()て、単一のタグまたはタグの配列で機能するバージョンを次に示します。

/**
 * @param $str string
 * @param $tags string | array
 * @return string
 */

function strip_specific_tags ($str, $tags) {
  if (!is_array($tags)) { $tags = array($tags); }

  foreach ($tags as $tag) {
    $_str = preg_replace('/<\/' . $tag . '>/i', '', $str);
    if ($_str != $str) {
      $str = preg_replace('/<' . $tag . '[^>]*>/i', '', $_str);
    }
  }
  return $str;
}
于 2019-04-24T09:34:10.593 に答える