it-swarm-id.com

Cara mengganti gaya baris baru yang berbeda di PHP cara paling cerdas?

Saya memiliki teks yang mungkin memiliki gaya baris baru yang berbeda. Saya ingin mengganti semua baris baru '\ r\n', '\ n', '\ r' dengan baris yang sama (dalam hal ini\r\n).

Apa cara tercepat untuk melakukan ini? Solusi saya saat ini terlihat seperti ini yang sangat sial:

    $sNicetext = str_replace("\r\n",'%%%%somthing%%%%', $sNicetext);
    $sNicetext = str_replace(array("\r","\n"),array("\r\n","\r\n"), $sNicetext);
    $sNicetext = str_replace('%%%%somthing%%%%',"\r\n", $sNicetext);

Masalahnya adalah Anda tidak dapat melakukan ini dengan satu penggantian karena\r\n akan diduplikasi ke\r\n\r\n.

Terima kasih untuk bantuannya!

31
Carsten Schmitz
$string = preg_replace('~\R~u', "\r\n", $string);

Jika Anda tidak ingin mengganti semua baris baru Unicode tetapi hanya yang bergaya CRLF, gunakan:

$string = preg_replace('~(*BSR_ANYCRLF)\R~', "\r\n", $string);

\R cocok dengan baris baru ini, u adalah pengubah untuk memperlakukan string input sebagai UTF-8.


Dari dokumen PCRE :

Apa yang cocok dengan \R

Secara default, urutan\R dalam suatu pola cocok dengan urutan Unicode newline Lainnya, apa pun yang telah dipilih sebagai urutan akhir baris. Jika Anda tentukan

     --enable-bsr-anycrlf

default diubah sehingga\R hanya cocok dengan CR, LF, atau CRLF. Apa pun yang dipilih saat PCRE dibangun dapat ditimpa ketika fungsi perpustakaan Dipanggil.

dan

Urutan baris baru

Di luar kelas karakter, secara default, urutan escape\R cocok dengan Urutan baris baru Unicode. Dalam mode non-UTF-8\R setara dengan Berikut:

    (?>\r\n|\n|\x0b|\f|\r|\x85)

Ini adalah contoh dari "kelompok atom", rinciannya diberikan Di bawah ini. Grup khusus ini cocok dengan urutan dua karakter CR diikuti oleh LF, atau salah satu karakter tunggal LF (linefeed, U + 000A), VT (tab vertikal) , U + 000B), FF (formfeed, U + 000C), CR (carriage Kembali, U + 000D), atau NEL (baris berikutnya, U + 0085). Urutan dua karakter Diperlakukan sebagai unit tunggal yang tidak dapat dibagi.

Dalam mode UTF-8, dua karakter tambahan yang codepoint lebih besar Dari 255 ditambahkan: LS (pemisah baris, U + 2028) dan PS (pemisah paragraf, U + 2029). Dukungan properti karakter Unicode tidak diperlukan untuk Agar karakter ini dikenali.

Dimungkinkan untuk membatasi\R agar hanya cocok dengan CR, LF, atau CRLF (alih-alih Kumpulan lengkap dari akhiran Unicode) dengan mengatur opsi PCRE_BSR_ANYCRLF baik pada waktu kompilasi atau ketika pola cocok. (BSR adalah singkatan untuk "backslash R".) Ini dapat dijadikan default ketika PCRE dibangun; jika ini masalahnya, perilaku lain dapat diminta melalui opsi PCRE_BSR_UNICODE. Dimungkinkan juga untuk Menetapkan pengaturan ini dengan memulai string pola dengan salah satu dari Urutan berikut:

    (*BSR_ANYCRLF)   CR, LF, or CRLF only
    (*BSR_UNICODE)   any Unicode newline sequence

Ini menimpa default dan opsi yang diberikan ke pcre_compile () atau Pcre_compile2 (), tetapi mereka dapat ditimpa oleh opsi yang diberikan kepada Pcre_exec () atau pcre_dfa_exec (). Perhatikan bahwa pengaturan khusus ini, yang Tidak kompatibel dengan Perl, hanya dikenali pada awal pola , Dan pengaturan tersebut harus dalam huruf besar. Jika lebih dari satu di antaranya Hadir, yang terakhir digunakan. Mereka dapat digabungkan dengan perubahan [new____] konvensi baris baru; misalnya, suatu pola dapat dimulai dengan:

    (*ANY)(*BSR_ANYCRLF)

Mereka juga dapat dikombinasikan dengan urutan khusus (* UTF8) atau (* UCP). Di dalam kelas karakter,\R diperlakukan sebagai urutan escape Yang tidak dikenal, dan sesuai dengan huruf " R "secara default, tetapi menyebabkan kesalahan Jika PCRE_EXTRA diatur.

81
NikiC

Untuk menormalkan baris baru, saya selalu menggunakan:

$str = preg_replace('~\r\n?~', "\n", $str);

Itu menggantikan Mac lama (\r) dan Windows (\r\n) baris baru dengan Unix yang setara (\n).

Saya lebih suka menggunakan \n karena hanya membutuhkan satu byte, bukan dua, tetapi Anda dapat dengan mudah mengubahnya ke \r\n.

12
Alix Axel

Bagaimana tentang

$sNicetext = preg_replace('/\r\n|\r|\n/', "\r\n", $sNicetext);
8
Tomalak

saya pikir cara paling cerdas/paling sederhana untuk mengkonversi ke CRLF adalah:

$output = str_replace("\n", "\r\n", str_replace("\r", '', $input));

untuk mengkonversi ke LF hanya:

$output = str_replace("\r", '', $input);

itu jauh lebih mudah daripada ekspresi reguler.

1
Roey