2014-10-19 21 views
0

我有一个奇怪的PHP问题。PHP preg_replace浏览器和控制台不同的行为

我使用此代码读取HTML页面

$fh = fopen('html_page.htm', 'r+'); 
$html_page = ''; 

while (!feof($fh)) 
{ 
    $html_page .= fread($fh, 1024); 
} 
fclose($fh); 

而且在该网页中我有这样的事情:

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> 

而且这样的:

<span>&nbsp;&nbsp;324.85&nbsp;SGD&nbsp;</span> 

所以我想从所有的内容中去掉那些标签的内容,使第一个例子变成空字符串和第二例这样的:

324.85 SGD 

我的解决办法是这样的:($ str变量保存标签的内容,只是内容没有标签)

$str = trim(preg_replace('/[^\w+ .,:;]/', ' ', $str)); 

当我通过浏览器加载我的脚本时,这很有效。 即使我得到这样的:

324.85 SGD // Inner extra spaces not removed 

注:我的剧本被加载,而不是HTML页面,它仍然是读取槽FREAD()调用。

我在浏览器中显示输出(是的,我在看HTML源代码),它的表现很好。 但是,当我运行脚本槽控制台,它仍然以同样的方式读取相同的HTML页面,基本上所有的都一样,除了我保存输出到.txt文件或显示它在控制台我得到这个。

第一个例子与所有的& nbsp;

     

而第二与& NBSP混合值;

  324.85 SGD 

当我运行低谷的浏览器,因为在节目中,我检查空字符串值(第一个例子),它确实是空的第一个例子,这是不喜欢这些人物在那里,但不显示。

解决方案,我发现是这样的:

$str = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', ' ', $str)); 

作品在这两种情况下。 输出: 324.85 SGD

所以问题是,为什么PHP在这种情况下通过浏览器和控制台运行时表现如此不同?

什么是标准化字符串以消除多余的内部空间的最佳方式是什么?

从这:

324.85 SGD 

这个

324.85 SGD 

但是,当然,我想它的所有字符串的工作,无论他们是多么漫长。

谢谢。

回答

1

它似乎与字符编码有关。我想知道你的HTML是UTF-8,而你的控制台不支持那样或类似的东西。

字符编码是了解处理字符时非常重要的一点。

我认为可以工作的是将输出更改为latin1,但这是一个非常疯狂的猜测: 因此,尝试将utf8_decode()包装到您要输出的内容中。

编辑:以上是我的第一个猜测,但经过一点谷歌搜索,我发现可能fread()是你的问题。请看看: set utf-8 encoding for fread fwrite and http://php.net/manual/en/function.fopen.php#104325

+0

我认为可能就是这样。当我在网页上打印时,我使用echo,当然在文件fwrite()中。所以它可能是fread()和HTML的字符编码。谢谢。 – 2014-10-28 05:17:36

相关问题