我有奇怪的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>
所以我想从所有&amp; nbsp;中删除这些标签的内容所以第一个例子变为空字符串,第二个例子变为:
324.85 SGD
我的解决方案是:( $ str变量包含标签的内容,只包含内容而非标签)
$str = trim(preg_replace('/[^\w+ .,:;]/', ' ', $str));
当我通过浏览器加载脚本时,这很有效。 即使我得到了这个:
324.85 SGD // Inner extra spaces not removed
注意:我的脚本已加载,而不是HTML页面,它仍然通过fread()调用读取。
我在浏览器中显示输出(是的,我正在查看HTML源代码)并且表现良好。 然而,当我通过控制台运行脚本并且它仍然以相同的方式读取相同的HTML页面时,基本上所有内容都相同,除了我将输出保存到.txt文件或在控制台中显示它我得到了这个。
所有&amp; nbsp;
的第一个例子Â Â Â Â Â
其次是将数值与&amp; nbsp;
混合在一起Â Â 324.85Â SGDÂ
这不是这些字符在那里但是当我通过浏览器运行时没有显示,因为在程序中我正在检查空字符串值(第一个例子)并且它对于第一个例子它确实是空的。
我发现的解决方案是:
$str = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', ' ', $str));
适用于这两种情况。 输出: 324.85 SGD
所以问题是,为什么在这种情况下通过浏览器和控制台运行时PHP的行为会如此不同?
规范化字符串以删除额外内部空间的最佳方法是什么?
由此:
324.85 SGD
到这个
324.85 SGD
但是我当然希望它能在所有字符串上工作,无论它们有多长。
感谢。
答案 0 :(得分:1)
它似乎与字符编码有关。我会重新确认你的HTML是UTF-8,而你的控制台不支持那种或类似的东西。
使用字符时,字符编码是一个非常重要的事情。
我认为可行的方法是将输出更改为latin1,但这是一个非常疯狂的猜测: 因此,尝试将utf8_decode()包装在您要输出的内容周围。
编辑:上面是我的第一个猜测,但经过一点谷歌搜索后,我发现可能是fread()是你的问题。请看: set utf-8 encoding for fread fwrite 和 http://php.net/manual/en/function.fopen.php#104325