40

改行スタイルが異なる可能性のあるテキストがあります。すべての改行 '\r\n', '\n','\r' を同じ改行 (この場合は \r\n ) に置き換えたい。

これを行う最速の方法は何ですか? 私の現在のソリューションは次のようになります。

    $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);

問題は、 \r\n が \r\n\r\n に複製されるため、1 回の置換ではこれを実行できないことです。

ご協力ありがとうございました!

4

5 に答える 5

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

すべての Unicode 改行ではなく、CRLF スタイルの改行だけを置き換えたい場合は、次を使用します。

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

\Rこれらの改行に一致uし、入力文字列を UTF-8 として扱うための修飾子です。


PCRE ドキュメントから:

\R一致するもの

デフォルトでは、パターン内のシーケンス \R は、行末シーケンスとして選択されているものは何でも、任意の Unicode 改行シーケンスと一致します。指定すれば

     --enable-bsr-anycrlf

\R が CR、LF、または CRLF のみに一致するようにデフォルトが変更されました。PCRE のビルド時に選択されたものは、ライブラリ関数が呼び出されたときにオーバーライドできます。

改行シーケンス

デフォルトでは、文字クラスの外では、エスケープ シーケンス \R は任意の Unicode 改行シーケンスと一致します。非 UTF-8 モードでは、\R は次と同等です。

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

これは「アトミック グループ」の例であり、その詳細を以下に示します。この特定のグループは、CR の後に LF が続く 2 文字のシーケンス、または単一文字の LF (ラインフィード、U+000A)、VT (垂直タブ、U+000B)、FF (フォームフィード、U+000C)、CR のいずれかに一致します。 (改行、U+000D)、または NEL (次の行、U+0085)。2 文字のシーケンスは、分割できない 1 つの単位として扱われます。

UTF-8 モードでは、コードポイントが 255 より大きい 2 つの文字が追加されます: LS (行区切り、U+2028) と PS (段落区切り、U+2029)。これらの文字を認識するために、Unicode 文字プロパティのサポートは必要ありません。

コンパイル時またはパターンの一致時にオプション PCRE_BSR_ANYCRLF を設定することにより、(Unicode 行末の完全なセットではなく) CR、LF、または CRLF のみに一致するように \R を制限することができます。(BSR は「バックスラッシュ R」の省略形です。) これは、PCRE のビルド時にデフォルトにすることができます。この場合、PCRE_BSR_UNICODE オプションを介して他の動作を要求できます。次のいずれかのシーケンスでパターン文字列を開始することにより、これらの設定を指定することもできます。

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

これらは、デフォルトと、pcre_compile() または pcre_compile2() に指定されたオプションをオーバーライドしますが、pcre_exec() または pcre_dfa_exec() に指定されたオプションによってオーバーライドできます。これらの特別な設定は Perl と互換性がなく、パターンの最初でのみ認識され、大文字でなければならないことに注意してください。それらが複数存在する場合は、最後のものが使用されます。これらは、改行規則の変更と組み合わせることができます。たとえば、パターンは次のように開始できます。

    (*ANY)(*BSR_ANYCRLF)

(*UTF8) または (*UCP) 特殊シーケンスと組み合わせることもできます。文字クラス内では、\R は認識されないエスケープ シーケンスとして扱われるため、既定では文字 "R" と一致しますが、PCRE_EXTRA が設定されている場合はエラーが発生します。

于 2011-10-20T13:31:10.690 に答える
19

改行を正規化するには、私はいつも使用します:

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

古い Mac ( \r) と Windows ( \r\n) の改行を Unix の同等のもの ( \n) に置き換えます。

\n2 バイトではなく 1 バイトしかかからないため、使用することを好みますが、簡単に\r\n.

于 2011-11-02T02:21:33.417 に答える
10

どうですか

$sNicetext = preg_replace('/\r\n|\r|\n/', "\r\n", $sNicetext);
于 2011-10-20T13:30:58.623 に答える