我需要处理多个文件,这些文件是使用一些格式错误的 HTML 标记编写的非常旧的 SHTML 文件。
例如,给定页面将遵循此结构
<!--#include virtual="../includes/header.shtml"-->
<title>Welcome</title>
<div class="fudgeLeft">
<div class="mainContent">
<link rel="stylesheet" href="../css/style.css">
<img src="hockeyflag.jpg" alt="">
<p>text
<p>text
<p>more text
</div>
<!--#include virtual="../includes/footer.shtml"-->
header.shtml
包括 HTML 文档的开始标签,直到并包括标签<body>
。footer.shtml
包括结尾的</div>
s</body>
、 和</html>
。- 请注意,页眉和页脚之间的每个标签都出现在不同的行上,并且一些标签没有正确关闭。
[老实说,我不知道最初的开发人员在构建这些页面时在想什么(或吸烟)。]
无论如何,我已经编写了一个脚本,它使用DOMDocument清理这些页面,转换一个特定的标签,并将更新的文档保存为一个新文件。
我遇到的问题是新创建的文件的更改超出了应有的程度。
<!--#include virtual="../includes/header.shtml"--><title>Welcome</title><div class="fudgeLeft">
<div class="mainContent">
<link rel="stylesheet" href="../css/style.css" />
<img src="hockeyflag.jpg" alt="" />
<p>text</p>
<p>text</p>
<p>more text</p>
</div>
<!--#include virtual="../includes/footer.shtml"--></div>
- 现在请注意,有些行已被粘贴(不是什么大问题),但标签已被关闭。同样,结束标签之一位于页脚之后。
所以我的问题是有没有办法配置 DOMDocument 以保持错误的 HTML 原样?我的目标是只更改一个标签,但保持丑陋的文档不变。
我的剧本很长,但简而言之
$doc = new DOMDocument();
@$doc->loadHTMLFile('path-to-shtml-file', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
// convert one tag
$doc->saveHTMLFile('path-to-new-shtml-file');
我正在运行 PHP 7。