3

リテラル文字列を含むテキスト ファイルがあります\r\n。これを実際の改行 (\n) に置き換えたい。

正規表現/\\r\\n/が一致する必要があることはわかっています(Reggyでテストしました)が、PHPで動作させることはできません。

次のバリエーションを試しました。

preg_replace("/\\\\r\\\\n/", "\n", $line);

preg_replace("/\\\\[r]\\\\[n]/", "\n", $line);

preg_replace("/[\\\\][r][\\\\][n]/", "\n", $line);

preg_replace("/[\\\\]r[\\\\]n/", "\n", $line);

バックスラッシュを置き換えようとすると、正しく機能します。r を追加するとすぐに、一致するものが見つかりません。

私が読んでいるファイルはUTF-16としてエンコードされています。

編集:

私もすでに使ってみstr_replace()ました。

ここでの問題は、ファイルの文字エンコーディングにあると考えています。私は次のことを試しましたが、うまくいきました:

$testString = "\\r\\n";
echo preg_replace("/\\\\r\\\\n/", "\n", $testString);

しかし、ファイルから読み込んでいる行では機能しません。

4

5 に答える 5

5

正規表現を理解する労力を節約して、str_replace()代わりに試してください。

str_replace('\r\n', "\n", $string);
于 2011-08-17T19:44:47.820 に答える
4

正規表現を理解し、二重引用符でエスケープする手間を省いてください。

$fixed = str_replace('\r\n', "\n", $line);

それが価値があるもののために、preg_replace("/\\\\r\\\\n/", "\n", $line);うまくいくはずです。デモンストレーションとして:

var_dump(preg_replace("/\\\\r\\\\n/", "NL", 'Cake is yummy\r\n\r\n'));

与えます:string(17) "Cake is yummyNLNL"

また、次の場合も問題ありません'/\\\r\\\n/''/\\\\r\\\\n/'

重要- 上記が機能しない場合、リテラル\r\nが一致させようとしているものであると確信していますか?..

于 2011-08-17T19:47:42.963 に答える
2

UTF-16が問題です。生のバイトを処理しているだけの場合は、完全なシーケンスを使用して次のものを置き換えることができます。

$out = str_replace("\x00\x5c\x00\x72\x00\x5c\x00\x6e", "\x00\x0a", $in);

これは、ビッグエンディアンUTF-16を想定しています。それ以外の場合は、ゼロバイトをスワップして非ゼロの後に追加します。

$out = str_replace("\x5c\x00\x72\x00\x5c\x00\x6e\x00", "\x0a\x00", $in);

それでも問題が解決しない場合は、入力ファイルのバイトダンプを投稿して、実際に何が含まれているかを確認してください。

于 2011-08-17T20:00:11.377 に答える
2
$result = preg_replace('/\\\\r\\\\n/', '\n', $subject);

上記の正規表現は、Windows で通常使用される改行の種類 ( \r\n) をLinuxの改行 ( \n) に置き換えます。

参考文献:

于 2011-08-18T00:04:49.410 に答える