PHP动态加载html文件之后<head>中内容全部移动到<body>中导致页面头部存在空白

本文介绍了一个常见的HTML布局错乱问题——由于文件头部存在UTF-8的BOM标记导致样式和脚本位置异常。文章详细解释了BOM产生的原因及如何检查文档是否含有BOM。同时分享了一段PHP脚本,可以自动扫描并清除指定目录下所有文件的BOM标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        单独查看HTML文档,文件内容与结构均正常,无错误。但是访问相应的PHP文件时,<head>中的样式,脚本,meta标签全部移动到<body>里,并且在这些标签前还有空行;网上还是许多人遇到了这个问题,解决的方法也有好多,网上有问题说,是HTML文档中标签不闭合,也有说是PHP文件中include的问题。但是感觉都不是关键所在。
        后来在优快云中找到一篇文章,介绍了这个问题,按照这个问题的解决思路,我最终很方便地就解决了这个问题。

        首先,问题的原因是UTF-8的BOM。是微软这家人的文本编辑器默认会给使用记事本打开的文档头部添加的一个标签(使用其他的编辑器就不会出现这种情况),这样子会使得浏览器在解析的时候出现如上情况。

        如何查看文档有没有BOM存在呢?使用dreamweaver打开文档,然后菜单栏->修改->页面属性->标签->标签/编码,看选项卡中是否有勾选“包括Unicode签名“一项。

        但是,我也不清楚我的文档哪个被我手贱使用windows的文本编辑器编辑过,一个一个找又麻烦,所以这里提供我在网上找到的一个php文档,将他保存为php然后放在你所要清理的文件目录的根目录,然后使用浏览器访问这个文件,就会自动清楚该目录树下所有具有BOM的文档的头部标记。亲测有效。

<?php 
$basedir = str_replace('/clearBOM.php','',str_replace('\\','/',dirname(__FILE__)));
$auto = 1;
checkdir($basedir);
function checkdir($basedir){
	if ($dh = opendir($basedir)) {
		while (($file = readdir($dh)) !== false) {
			if ($file != '.' && $file != '..'){
				if (!is_dir($basedir.'/'.$file)) {
					$filename = $basedir.'/'.$file;
					echo 'filename:'.$basedir.'/'.$file.checkBOM($filename).'<br>';
				} else {
					$dirname = $basedir.'/'.$file;
					checkdir($dirname);
				}
			}
		}
		closedir($dh);
	}
}

function checkBOM ($filename) {
	global $auto;
	$contents = file_get_contents($filename);
	$charset[1] = substr($contents, 0, 1);
	$charset[2] = substr($contents, 1, 1);
	$charset[3] = substr($contents, 2, 1);
	if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
		if ($auto == 1) {
			$rest = substr($contents, 3);
			rewrite ($filename, $rest);
			return '<font color=red>BOM found,automatically removed.</font>';
		} else {
			return '<font color=red>BOM found.</font>';
		}
	} else {
		return 'BOM Not Found.';
	}
}

function rewrite ($filename, $data) {
	$filenum = fopen($filename, 'w');
	flock($filenum, LOCK_EX);
	fwrite($filenum, $data);
	fclose($filenum);
}
?>

            以上PHP无需进行任何修改。

<think>好的,我现在需要回答用户关于HTML中<head>和<header>标签区别的问题。用户想知道为什么定义文档头部的标签是<head>而不是<header>,可能有些混淆这两个标签的用途。 首先,我得确认自己准确理解这两个标签的作用。根据HTML标准,<head>元素是用于包含元数据、链接到CSS和JS文件、标题等信息的容器,这些内容不会直接显示在页面上。而<header>则是页面结构的一部分,通常用于放置网站的标志、导航栏等可见的头部内容。 接下来,用户可能将“头部”理解为页面顶部的可见部分,所以会疑惑为什么不用<head>。这时候需要解释两者的不同用途和语义。可能需要从HTML文档的基本结构入手,说明<head>和<body>的区别,而<header>位于<body>内。 然后,考虑到用户可能对HTML结构不太熟悉,需要用简单明了的例子来说明。比如,展示一个基本的HTML文档,其中<head>包含<title>和<meta>,而<body>的<header>包含网站标题和导航链接。 还需要强调语义化标签的重要性,HTML5引入的<header>、<footer>等标签是为了更好地描述页面结构,提升可访问性和SEO,而<head>是更底层的文档信息容器。 最后,检查是否有其他需要注意的地方,比如常见的误解或相关标签的对比,确保回答全面且易于理解。可能需要提醒用户,虽然称相似,但它们的用途和位置完全不同,避免混淆。</think>在HTML中,`<head>`和`<header>`是两个完全不同的标签,它们的用途和语义有本质区别。以下是逐步解释: --- ### 1. **`<head>`标签的作用** - **定位与功能** `<head>`是HTML文档的“元数据容器”,用于定义与页面相关的**非可视化信息**,例如: ```html <head> <title>页面标题</title> <meta charset="UTF-8"> <link rel="stylesheet" href="style.css"> <script src="script.js"></script> </head> ``` - **不可见性** `<head>`中的内容**不会直接显示在浏览器页面**中(`<title>`标签例外,它会显示在浏览器标签页上)。 --- ### 2. **`<header>`标签的作用** - **定位与功能** `<header>`是HTML5引入的**语义化标签**,用于定义页面或区块的“可见头部内容”,例如: ```html <body> <header> <h1>网站标题</h1> <nav>导航链接</nav> </header> </body> ``` - **可见性** `<header>`中的内容**直接显示在页面上**,通常包含LOGO、导航栏、搜索框等。 --- ### 3. **为什么称不同?** - **历史原因** `<head>`在HTML早期版本中就已存在,用于定义文档元数据;而`<header>`是HTML5新增的语义化标签,目的是更清晰地描述页面结构。 - **语义区分** - `<head>`:文档的“技术性头部”(元数据) - `<header>`:内容的“逻辑性头部”(用户可见) --- ### 4. **常见误解对比** | 标签 | 位置 | 内容类型 | 是否可见 | |---------------|------------|----------------|-------------| | `<head>` | `<html>`内 | 元数据 | 不可见 | | `<header>` | `<body>`内 | 页面或区块头部 | 可见 | --- ### 5. **总结** - **`<head>`**:用于定义文档的元信息(如标题、样式表、脚本),是浏览器和搜索引擎的“后台数据”。 - **`<header>`**:用于组织用户可见的页面头部内容(如标题、导航),是页面结构的组成部分。 两者称相似但功能完全无关,这种设计是为了区分“文档元信息”和“页面内容结构”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值