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

时间:2014-10-19 16:16:26

标签: 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>

就像这样:

<span>&nbsp;&nbsp;324.85&nbsp;SGD&nbsp;</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

但是我当然希望它能在所有字符串上工作,无论它们有多长。

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

我认为可行的方法是将输出更改为latin1,但这是一个非常疯狂的猜测: 因此,尝试将utf8_decode()包装在您要输出的内容周围。

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