2014-10-19 113 views
0

我有一個奇怪的PHP問題。PHP preg_replace瀏覽器和控制檯不同的行爲

我使用此代碼讀取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> 

所以我想從所有的內容中去掉那些標籤的內容,使第一個例子變成空字符串和第二例這樣的:

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 

但是,當然,我想它的所有字符串的工作,無論他們是多麼漫長。

謝謝。

回答

1

它似乎與字符編碼有關。我想知道你的HTML是UTF-8,而你的控制檯不支持那樣或類似的東西。

字符編碼是瞭解處理字符時非常重要的一點。

我認爲可以工作的是將輸出更改爲latin1,但這是一個非常瘋狂的猜測: 因此,嘗試將utf8_decode()包裝到您要輸出的內容中。

編輯:以上是我的第一個猜測,但經過一點谷歌搜索,我發現可能fread()是你的問題。請看看: set utf-8 encoding for fread fwrite and http://php.net/manual/en/function.fopen.php#104325

+0

我認爲可能就是這樣。當我在網頁上打印時,我使用echo,當然在文件fwrite()中。所以它可能是fread()和HTML的字符編碼。謝謝。 – 2014-10-28 05:17:36

相關問題