通过DOMDocument PHP

时间:2017-05-17 16:09:06

标签: php html mysql mysqli domdocument

数据库的值为:This is a test.<br><h1>this is also a test.</h1>This is a test.<br>this is a test.<br>

使用mysql,值由$DBval['test']给出。 行设置为:

Type = LONGTEXT
    排序规则= UTF8_general_ci

  $doc = new DOMDocument();

  $test = $doc->createElement("div");
  $doc->appendChild($test);

  $test_value = $doc->createElement("p", $DBval['test']);
  $test->appendChild($test_value);

  echo $doc->saveXML();

结果:

  

"This is a test.<br><h1>this is also a test.</h1>This is a test.<br>this is a test.<br>"

结果用纯文本写成,奇怪的是双引号。

我只想将结果写成HTML,如下所示:

  

这是一个测试。

这也是一个测试。

这是一个   测试。
这是一个测试。

1 个答案:

答案 0 :(得分:2)

有几个原因可以解决这个问题(至少和预期一样)

  1. 如果您的格式错误,请 html你需要使用saveHTML()而不是saveXML()。
  2. 由于您的字符串已经包含一些html标记,因此您需要执行loadHTML();插入
  3. 您可以通过将DOMElement传递给saveHTML($ text_value)来回显该元素,这样您就不会回显所有文档。

  4. 考虑到domDocuemnt将会解除任何“自由浮动”状态。将文字转换为<p>标记。在这种仅文本节点的情况下,您应使用 - &gt; createTextNode()而不是。

  5. 现在,这是一个棘手的部分:你可以这样做:

      $doc = new DOMDocument();     
      $doc->loadHTML($DBval['test']);  
      echo $doc->saveHTML();
    

    但如果你想真正导入&#39; html到另一个DOMElement你需要导入它。这里使用了一个函数(为你的案例添加了一个函数,并为解释进行了评论)

      //For a valid html5 DOCTYPE declaration
      //$doc = new DOMDocument();
      $dom = new DOMImplementation;
      $doc = $dom->createDocument(null, 'html', $dom->createDocumentType('html'));
    
      //To keep thing tidy
      $doc->preserveWhiteSpace = false;
      $doc->formatOutput = true;
      $doc->encoding = 'utf8';
    
      //Creates your test div
      $test = $doc->createElement("div");
      $doc->appendChild($test);
    
      /** HERE STARTS THE MAGIC */
      $tempDoc= new DOMDocument; //Create a temp Doc to import the new html 
      libxml_use_internal_errors(true); //This prevent some garbage warning.
    
      //Prevent encoding garbage on import, change accordingly to your setup
      $htmlToImport = mb_convert_encoding($DBval['test'], 'HTML-ENTITIES', 'utf8');
      //Load your Html into the temp document
      //As commented, we'll encapsulate the html in a span to prevent DOM to automaticly add the 'p' tag
      $tempDoc->loadHTML('<span>'.$htmlToImport.'</span>');
      //$tempDoc->loadHTML($htmlToImport); //@REMOVED: was adding 'p' tag
    
      //Restore Garbage Warning report
      libxml_clear_errors();  
      libxml_use_internal_errors(false);
    
      //Get the htl to import now sotred in the body of the temp document
      $bodyToImport = $tempDoc->getElementsByTagName('body')->item(0);
    
      //Import all those new childs to your div
      foreach($bodyToImport->childNodes as $node){
        $test->appendChild($doc->importNode($node->cloneNode(true),true));
      }    
    
      /** All this to replace these 2 lines :( 
      $test_value = $doc->createElement("p", $DBval['test']);
      $test->appendChild($test_value);
      */
    
      //echo $doc->saveXML();
      echo $doc->saveHTML(); //echo all the document
      //echo $doc->saveHTML($test); //echo only the test 'div'
    

    我使用了“垃圾”这个术语。因为你可以忽略这是一个可怕的错误,但是当你开发时,你可能会看看那些错误。

    我知道这看起来有些过分,但这是我设法使用任何HTML,charset并使其以干净的方式工作的唯一方式。

    真的希望这会有所帮助。 DOM可能很棘手,但如果使用得当,它具有保持结构的能力。