PHP HTML 标签转换为字符串


php html tags converted to string

我正在尝试将带有php的HTML文件作为DOM文档进行处理。处理是可以的,但是当我使用 $html->saveHTMLFile("file_out.html") 保存 html 文档时;所有链接标记都从以下位置转换:

Click here: <a title="editable" href="http://somewhere.net">somewhere.net</a>

Click here: &lt;a title="editable" href="http://somewhere.net"&gt; somewhere.net &lt;/a&gt; 

我将链接处理为 php 脚本,也许这会有所不同?我无法使用 htmlentitites_decode() 等将&lt;转换回<。我可以使用任何其他转换或编码吗?

php 脚本如下所示:

<?php
$text = $_POST["textareaX"];
$id = $_GET["id"];
$ref = $_GET["ref"];
$html = new DOMDocument(); 
$html->preserveWhiteSpace = true;
$html->formatOutput       = false;
$html->substituteEntities = false;
$html->loadHTMLFile($ref.".html"); 
$elem = $html->getElementById($id); 
$elem->nodeValue = $innerHTML;
if ($text == "")
  { $text = "--- No details. ---"; }
$newtext = "";
$words = explode(" ",$text);
foreach ($words as $word) {
  if (strpos($word, "http://") !== false) {
    $newtext .= "<a alt='"editable'" href='"".$word."'">".$word."</a>"; 
    }
  else {$newtext .= $word." ";}
}
$text = $newtext;
function setInnerHTML($DOM, $element, $innerHTML) {
  $node = $DOM->createTextNode($innerHTML);
  $children = $element->childNodes;
  foreach ($children as $child) {
    $element->removeChild($child);
  }
  $element->appendChild($node);
}
setInnerHTML($html, $elem, $text);
$html->saveHTMLFile($ref.".html");
header('Location: '."tracking.php?ref=$ref&user=unLock");
?>

我们从"id"和"ref"中获取对文件的引用,并从数组"textareaX"中获取输入数据。接下来,我打开文件,通过 id 识别 html 元素,并将其内容(链接)替换为文本区域中的输入数据。我只在文本区域中提供 href,脚本从中构建超链接。接下来,我将其重新插入原始文件并覆盖输入文件。

但是,当我编写新文件时,链接<a href= ...> </a>转换为&lt;a href=...&gt; &lt;/a&gt;,这是一个问题。

下面是已确定问题的代码的一部分:

<?php
function setInnerHTML($DOM, $element, $innerHTML) {
  /*********************************
      Well, there's your problem:
  **********************************/
  $node = $DOM->createTextNode($innerHTML);
  $children = $element->childNodes;
  foreach ($children as $child) {
    $element->removeChild($child);
  }
  $element->appendChild($node);
}
?>

您正在做的是将新的锚点 (a) 标签作为字符串传递,然后从中创建文本节点(文本就是文本,而不是 HTML)。createTextNode 函数会自动对任何 HTML 标记进行编码,以便在浏览器查看时它们将作为文本显示(这样您就可以在页面上将 HTML 显示为可见代码(如果您愿意),则可以在页面上显示 HTML)。

您需要做的是将元素创建为 HTML(而不是文本节点),然后附加它:

<?php
function setInnerHTML($DOM, $element, $innerHTML) {
  $f = $DOM->createDocumentFragment();
  $f->appendXML($innerHTML);
  $element->appendChild($f);
}
?>