Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DOMDocument删除JavaScript字符串中的HTML标记_Javascript_Php_Domdocument_Html Formatting - Fatal编程技术网

DOMDocument删除JavaScript字符串中的HTML标记

DOMDocument删除JavaScript字符串中的HTML标记,javascript,php,domdocument,html-formatting,Javascript,Php,Domdocument,Html Formatting,我开发PHP应用程序已经有一段时间了。但这真的让我很挣扎。我正在使用DomDocument加载完整的HTML页面。这些页面是外部的,可能包含JavaScript。这是我无法控制的 在某些页面上,当涉及到JavaScript字符串中的基本HTML格式时,事情并没有按预期的方式呈现。我写了一个例子来解释这一切 <?php $html = new DOMDocument(); libxml_use_internal_errors(true); $strPage = '<html>

我开发PHP应用程序已经有一段时间了。但这真的让我很挣扎。我正在使用DomDocument加载完整的HTML页面。这些页面是外部的,可能包含JavaScript。这是我无法控制的

在某些页面上,当涉及到JavaScript字符串中的基本HTML格式时,事情并没有按预期的方式呈现。我写了一个例子来解释这一切

<?php
$html = new DOMDocument();

libxml_use_internal_errors(true);

$strPage = '<html>
<head>
<title>Demo</title>
<script type="text/javascript">
var strJS = "<b>This is bold.</b><br /><br />This should not be bold. Where did my closing tag go to?";
</script>
</head>
<body>
<script type="text/javascript">
document.write(strJS);
</script>
</body>
</html>';

$html->loadHTML($strPage);
echo $html->saveHTML();
exit;
?>
loadHTML($strPage);
echo$html->saveHTML();
出口
?>
我错过什么了吗

编辑:我已经更改了演示。将LoadHTML更改为LoadXML现在不再有效,演示的输出将通过w3c验证。另外,将CDATA块添加到JavaScript中似乎没有任何效果。

我不知道为什么(试图找出原因),但如果您使用
loadXML
而不是
loadHTML
加载HTML,则效果会很好

$html = new DOMDocument();

libxml_use_internal_errors(true);

$strPage = "<html><head>";
$strPage .= "<script type=\"text/javascript\">";
$strPage .= "var strJS = \"<b>This is bold.</b><br /><br />This should not be bold. Where did my closing tag go to?\";";
$strPage .= "</script>";
$strPage .= "<body>";
$strPage .= "<script type=\"text/javascript\">";
$strPage .= "document.write(strJS);";
$strPage .= "</script>";
$strPage .= "</body>";
$strPage .= "</head></html>";

$html->loadXML($strPage);

echo $html->saveHTML();
$html=newDOMDocument();
libxml\u使用\u内部错误(true);
$strPage=“”;
$strPage.=“”;
$strPage.=“var strJS=\”这是粗体。

这不应该是粗体。我的收尾标签到哪里去了?\“;”; $strPage.=“”; $strPage.=“”; $strPage.=“”; $strPage.=“document.write(strJS);”; $strPage.=“”; $strPage.=“”; $strPage.=“”; $html->loadXML($strPage); echo$html->saveHTML();

虽然HTML实际上是无效的,但一切都在头部。

LIBXML\u SCHEMA\u CREATE
添加到
loadHTML()
选项将解决此问题

<?php
$html = new DOMDocument();

libxml_use_internal_errors(true);

$strPage = '<html>
<head>
<title>Demo</title>
<script type="text/javascript">
var strJS = "<b>This is bold.</b><br /><br />This should not be bold. Where did my closing tag go to?";
</script>
</head>
<body>
<script type="text/javascript">
document.write(strJS);
</script>
</body>
</html>';

$html->loadHTML($strPage, LIBXML_HTML_NODEFDTD | LIBXML_SCHEMA_CREATE);
echo $html->saveHTML();
exit();


?>
loadHTML($strPage,LIBXML\u HTML\u NODEFDTD | LIBXML\u SCHEMA\u CREATE);
echo$html->saveHTML();
退出();
?>

您是否遗漏了什么?是->“警告:DOMDocument::loadHTML():实体中意外的结束标记:b…”因此问题在于loadHTML正在吃掉脚本中的标记。这并没有回答你们的问题,但也许可以减轻一点神秘感。是的,谢谢。这正是本演示的内容。为什么它在吃标签?我不知道为什么。您可以通过反斜杠转义javascript字符串中包含的结束标记中的斜杠来避免它,例如
var strJS=“这是粗体的…”
Tested,您是对的。唯一的问题是我通常无法控制(外部的)加载到DOM中的HTML。这可能是loadHTML实现中的错误,还是需要打开隐藏选项才能使其正常工作?@James::“…需要HTML解析器执行第一个[…]“
我改变了我的例子。将loadHTML更改为loadXML不再有效。由于无效的HTML,它实际上被验证为有效的XML。@Arjoes如果您使用loadXML而不是loadHTML,您的示例代码将得到更新,这将起作用,我知道这并不理想,也不直观,但我只是认为DOMDocument不会像HTML标记那样看到
标记,您也无法从js中提取元素,就好像它已执行一样。如果您没有操作HTML或从中提取内容,那么您实际上想对字符串做什么,只是回显DOMDocument是错误的工具。抱歉,无法提供正确的解决方案:(