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です。

スクリプトはPHP5.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);

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

4

2 に答える 2

1

最良の推測:入力データはマルチバイト文字を許可する文字エンコードであり、これはループのためにPHPをスローしています。

mb_ereg_replaceマルチバイトバージョンが必要になる場合があります。

ordデバッグの目的で、各バイトを確認するために使用するなど、実際に受信している文字を確認すると役立つ場合があります。

于 2013-02-27T10:40:25.587 に答える
0

変更することで、これが機能しました:

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

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

于 2013-02-27T15:26:46.460 に答える