PHP preg_取代浏览器和控制台的不同行为

PHP preg_取代浏览器和控制台的不同行为,php,html,regex,unicode,Php,Html,Regex,Unicode,我有一个奇怪的PHP问题 我正在使用此代码阅读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> &l

我有一个奇怪的PHP问题

我正在使用此代码阅读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>
我的解决方案是:($str变量保存标记的内容,只是内容而不是标记)

当我通过浏览器加载我的脚本时,这很有效。 尽管我得到了这个:

324.85  SGD // Inner extra spaces not removed
注意:我的脚本是加载的,而不是HTML页面,它仍然是通过fread()调用读取的

我在浏览器中显示输出(是的,我正在查看HTML源代码),它运行良好。 然而,当我通过控制台运行脚本时,它仍然以相同的方式读取相同的HTML页面,基本上一切都是一样的,除了我将输出保存到.txt文件或在控制台中显示它之外,我得到了这个结果

第一个例子包括所有

    Â
第二,价值观与

  324.85 SGDÂ
这和我在浏览器中运行时没有显示的字符不同,因为在程序中我检查空字符串值(第一个示例),第一个示例中它实际上是空的

我找到的解决方案是:

$str = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', ' ', $str));
在这两种情况下都有效。 产出: 324.85新加坡元

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

规范化字符串以移除额外内部空间的最佳方法是什么

由此:

324.85  SGD
对此

324.85 SGD
但我当然希望它能在所有的弦上工作,不管它们有多长


谢谢。

这似乎与字符编码有关。我想确认你的HTML是UTF-8,而你的控制台不支持UTF-8或类似的东西

字符编码是处理字符时需要了解的一件非常重要的事情

我认为可以将输出更改为latin1,但这是一个相当疯狂的猜测: 因此,请尝试将utf8_decode()包装在您试图输出的内容周围

编辑:以上是我的第一个猜测,但在谷歌搜索了一下之后,我发现可能fread()是你的问题。请看: 和

我想可能就是这样。当我在网页上打印时,我使用了echo,当然还有fwrite()文件。所以它可能是HTML的fread()和字符编码。谢谢
324.85  SGD
324.85 SGD