我有一个奇怪的PHP问题。
我正在使用此代码读取HTML页面
$fh = fopen('html_page.htm', 'r+');
$html_page = '';
while (!feof($fh))
{
$html_page .= fread($fh, 1024);
}
fclose($fh);
在这个页面里,我有这样的东西:
<span> </span>
像这样:
<span> 324.85 SGD </span>
所以我想从所有 ;所以第一个例子变成空字符串,第二个例子变成这个:
324.85 SGD
我的解决方案是:($str变量保存标签的内容,只是内容而不是标签)
$str = trim(preg_replace('/[^'w+ .,:;]/', ' ', $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 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