2013-02-27 54 views
0

我有一個非常簡單的腳本,它在不同的服務器上表現出不同的行爲!腳本在其他服務器上的行爲不同

這是腳本:

<?php 
$list = file_get_contents("list.txt"); 
$list = str_replace(Array("\r\n", "\r", "\n", "\f"), "\n", $list); 
$all = explode("\n\n", $list); 


foreach($all as $k => $v) { 

    $b = preg_replace('/\s+/', '^', $v); 
    echo $b."<br/><br/>"; 
    } 
?> 

記載:

System:         Avro 
Supplier:       ABC Inc 

Quantity:       1 
Type:             ICD 
Key:              PA-658_ao8uY 
For Clarity:  PA-658_AO8UY 

Quantity:       10 
Type:             PSTHG 
Key:              tg675_0O09i8 
For Clarity:  PA-658_AO8UY 

我有3臺服務器上測試,我需要它的工作同所有3 他們從PHP 4.3 .10,5.2.13 & 5.3.5

該腳本在PHP 5.2.13上返回此值 - 這正是我所期待的。

System:^Avro^Supplier:^ABC^Inc 

Quantity:^1^Type:^ICD^Key:^PA-658_ao8uY^For^Clarity:^PA-658_AO8UY 

Quantity:^10^Type:^PSTHG^Key:^tg675_0O09i8^For^Clarity:^PA-658_AO8UY 

然而在4.3.10 & 5.3.5,我得到:

System:^^^^^Avro^Supplier:^^^ ^ABC^Inc 

Quantity:^^^ ^1^Type:^^^^^^^ICD^Key:^^^^^^^ PA-658_ao8uY^For^Clarity:^ PA-658_AO8UY 

Quantity:^^^ ^10^Type:^^^^^^^PSTHG^Key:^^^^^^^ tg675_0O09i8^For^Clarity:^ PA-658_AO8UY 

如何得到的輸出是對所有的人都一樣嗎?

感謝

更新: 我有這個工作,通過改變:

$b = preg_replace('/\s+/', '^', $v);

TO

$b = preg_replace('/(\s|\xa0)+/', '^', $v);

+0

也許問題是在[手動]說的東西(HTTP:// WWW .php.net /manual/en/function.str-replace.php):「因爲str_replace()從左向右替換,所以在執行多次替換時可能會替換先前插入的值,另請參閱本文檔中的示例。 – Voitcus 2013-02-27 09:20:38

+0

@Voitcus,'str_replace'部分似乎工作正常。這是'preg_replace',它無法替代所有的空格。它可能是一個字符編碼問題?除了PHP版本,這些系統是否都一樣? – 2013-02-27 09:28:45

+0

我不知道,但preg_replace存在一些問題,請看[this comment](http://www.php.net/manual/en/function.preg-replace.php#85416)和[這一個](http://www.php.net/manual/en/function.preg-replace.php#84385)。甚至與[mb編碼](http://www.php.net/manual/en/function.mb-internal-encoding.php) – Voitcus 2013-02-27 09:35:58

回答

0

我有這個工作,通過改變:

$b = preg_replace('/\s+/', '^', $v);

TO

$b = preg_replace('/(\s|\xa0)+/', '^', $v);

+0

小心!這可能適用於示例文本,但它也可能會通過替換部分其他多字節字符來破壞數據。 – 2013-02-27 15:32:00

1

的最佳答案:你輸入的數據是在字符編碼,允許多字節字符,這是拋出PHP的一個循環。

您可能需要mb_ereg_replace,多字節版本。

出於調試目的,查看您正在接收的實際字符(如使用ord查看每個字節)可能會有幫助。

+0

謝謝。我得到'致命錯誤:調用未定義的函數:mb_ereg_replace()in'當我在我的4.3.10盒子上試試這個時.. – MacMan 2013-02-27 11:39:08

+0

@ user1635970,根據文檔(在我的答案中鏈接)它自4.2.0以來就存在。 – 2013-02-27 11:46:59

+0

謝謝 - 我會檢查我輸入的內容是否正確。 – MacMan 2013-02-27 13:57:32

相關問題