PHP preg_replace浏览器和控制台的不同行为


PHP preg_replace browser and console different behaviour

我有一个奇怪的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>

所以我想从所有&nbsp;所以第一个例子变成空字符串,第二个例子变成这个:

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

但我当然希望它能适用于所有的字符串,无论它们有多长。

谢谢。

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

使用字符时,要理解字符编码是一件非常重要的事情。

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

编辑:以上是我的第一个猜测,但在谷歌上搜索了一下后,我发现fread()可能是你的问题。请查看:为fread-fwrite设置utf-8编码和http://php.net/manual/en/function.fopen.php#104325