php空白页面及unix下的LF

bom和上面的?>后有trailing whitespaces都有可能是页面出现异常,导致空白的原因,应该在程序中尽量杜绝,因为这两个错误很难调试,而不像动作未定义之类的访问accesslog会有日志。

为了做检查代码库中php的trailing whitespace,用正则表达式

\?>\s+$

来验证,应该是可以匹配到的,在?>后还有空白,但是跑出来的结果总是明明没有尾部空白也会报告,原来是unix下用vi查看文件的时候会有0d0a(fileformat = doc),或者0a(fileformat = unix),在win没这个问题,那个正则就可以正确匹配php尾部空白。但当这个文件上传到unix下用vi查看的时候就会带上LF,同一个文件用UE在win下看16进制和上传到unix后用vi的xxd模式。

被这个折腾了一天,库中既有dos格式的也有unix格式的format,咋正则都不好使,被这个折腾了一天,不确定哪个是0d0a,哪个是0a,或者没有LF,还有其他可能有些省略了尾端的闭合符号的情况……直接怒了。。。于是,如下三俗代码诞生了

[code language="php"]

/*
* 检查php文件末尾tag标记后续空白
* @param  string filename 需要检查的文件路径名
* @return boolean  true表示有末尾空白, false表示正常
*/
<?php
$c = file_get_contents($argv[1]);
$match ="?>";
$index = strrpos($c,$match);
if( $index == false)
return false;
$left = substr($c,$index+strlen($match));

if(!empty($left))
{
$l = trim($left);
if(empty(trim($l)) == false)  //后续有可见字符,则认为是省略了结束符
return false;
if(strlen($left) == 2 &&  $left[0] == chr(0x0d) && $left[1] == chr(0x0a)  )  //是0d0a
return false;
else if(strlen($left) == 1 && $left[0] == chr(0x0a) ) //是0a
return false;
else      //其它
return true;
}
return false;    //直接没带LF
[/code]

转载请注明来源:Leoncom-《php空白页面及unix下的LF》
Trackback

no comment untill now

Add your comment now