1

私はここで本当に奇妙な問題を抱えています。以下のコードを使用して、php経由でtxtファイルをサーバーにアップロードしています。

    <form enctype="multipart/form-data" action="index.php" method="POST">
        <input type="file" name="uploadfile">
        <button>Submit</button>
    </form>

ファイルをアップロードした後(これは正常に機能します)、次のコードを使用してコンテンツを配列に変換します。

$fp = @fopen($file, 'r'); 

if ($fp) { 
    $domains = explode("\n", fread($fp, filesize($file))); 
}

次に、preg_matchを実行して、配列をフィルタリングします。

$list = preg_grep('/^[a-z]+\.com$/', $domains);

$ domainsにtxtファイルのデータが入力されていることを確認しましたが、print_r($ list)を実行すると、「array()」のみが返されます。

FTPで同じ正確なテキストファイルをアップロードしてprint_r($ list)を実行すると、正常に機能します。

また、FTPクライアントで同じテキストファイルをアップロードすると、「domains.txt」のファイルサイズがhtmlフォームを使用してアップロードする場合よりも小さくなることに気付きました。ここで何が起こっているのか分かりますか?

4

1 に答える 1

2

これは、FTPクライアントによってUNIXとWindowsの間で行末が自動的に変更されることに関係している可能性があります。

これを解決するには、を使用trimする前に、を使用してすべての行をクレンジングしpreg_grepます。何かのようなもの:

foreach ($domains as $key => $domain) {
    $domains[$key] = trim($domain);
}

// or better use array_walk and closures PHP 5.3+
array_walk($domains, function(&$e) { $e = trim($e); });

問題は、正規表現に明示的な行頭と行末のアンカーがあるためです。

ところで、関数を使用するだけで、1つのステートメントでファイル全体を行の配列にロードできますfile

$domains = file($file);
于 2012-09-11T04:02:59.747 に答える