文字列から新しい行を削除し、1つの空のスペースで置き換える


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

文字列からすべての新しい行を削除したい。

私はこの正規表現を持っています、それはそれらすべてをキャッチすることができます、問題はそれをどの関数で使うべきかわからないことです。

/\r\n|\r|\n/

$string になるはずです:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

1
何千もの交換を行う場合は、の使用を避けpreg_replaceます。のほぼ2倍の速度str_replaceです。
Alex W

このスタンドアロンライブラリs($str)->normalizeLineEndings('')にあるように、役立つ場合があります。LF、CR、CRLFだけでなく、Unicodeの改行も削除されます。
2016

回答:


578

二重スペースが発生する二重改行には注意する必要があります。この非常に効率的な正規表現を使用します。

$string = trim(preg_replace('/\s\s+/', ' ', $string));

複数のスペースと改行は1つのスペースに置き換えられます。

編集:他の人が指摘したように、この解決策には単語間の単一の改行を一致させる問題があります。これは例にはありませんが、その状況がどのように発生するかを簡単に確認できます。別の方法は次のとおりです。

$string = trim(preg_replace('/\s+/', ' ', $string));

10
このソリューションを使用する前に、以下の私の回答と私の回答へのコメントを参照してください。このソリューションは期待どおりに機能しない可能性があります。
matsolof

1
正規表現「\ s空白文字に一致する」で、なぜ改行に一致するのですか?
Michael Z

2
私はすべての空白を削除/置換するための解決策を探していましたが、(二重の)空白は置き換えませんでした。これは、それを行った正規表現です/(?![ ])\s+/
。–アルゴリズム

あなたの解決策が私に多くの時間を節約してくれたことをuに知らせたかっただけです。
Parthapratim Neog 2015

183

受け入れられた回答に関するいくつかのコメント:

+手段「1以上」。繰り返す必要はないと思います\s。簡単に書けると思います'/\s+/'

また、文字列の最初と最後の空白を削除する場合は、を追加しtrimます。

これらの変更により、コードは次のようになります。

$string = preg_replace('/\s+/', ' ', trim($string));

あなたが正しい; /\s\s+/の改行と一致しませんfoo\nbar
アランムーア

79

使うだけ preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

str_replace()コードはそれほどきれいに見えませんが、これでうまくいくかもしれません。

$string = str_replace(array("\n", "\r"), '', $string);

ideoneでライブを見る


1
OPは、「段落」と「for」の間にスペースを必要とします。改行文字を削除するだけではありません。
Daniel Vandersluis

修正してください$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

そうでなければ、これ以上言うことはありません。それが一番簡単な答えだと思います!
erikbwork

3
@erik次に、私はそれを「修正」します。そのまま正常に動作します。
NullUserException

1
@Vineetこれは、正規表現の開始と終了を示す単なる区切り文字です
NullUserException

21
$string = str_replace(array("\n", "\r"), ' ', $string);

3
PHPのエスケープシーケンスは二重引用符で囲む必要があります。
Daniel Vandersluis、2009

これは、OPが望むものを正確に実行しません。これは、\r
elusive

@NullUser:これにコメントするのではなく、自分の投稿を更新してみませんか?
fabrik

@NullUser:すべてが「」ではなく「」に置き換えられることを除きます。
fabrik

12

その速度のためにstr_replaceを使用し、配列で二重引用符を使用する必要があります

str_replace(array("\r\n","\r"),"",$string);

リソースが少ない、完璧、TKS。
CONvid19

1
私は間違っているかもしれませんが、このコードはUnixシステムの改行文字を削除しません。これらのシステムでは\n、改行は正しいだけでなく\r\n、OPが
改行の

7

これがすでに提出された回答に対して何か価値があるかどうかはわかりませんが、投稿することもできます。

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);

6

PCRE正規表現の置換は、preg_replaceを使用して実行できます。http: //php.net/manual/en/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

新しい行を置き換えるか、文字をスペースに戻します。何も置き換えたくない場合は、2番目の引数をに変更し''ます。


1
preg機能はPCRE、POSIXない、正規表現を使用しています。eregPOSIXを使用する関数がありますが、現在は非推奨です。
Daniel Vandersluis、2009

5

これを使って:

一連の改行を空の文字列に置き換えます。

$string = preg_replace("/[\\n\\r]+/", "", $string);

または、おそらく改行を単一のスペースに置き換えたいでしょう:

$string = preg_replace("/[\\n\\r]+/", " ", $string);

コードを適切にフォーマットしてください。これは、関連する行を4つのスペースでインデントすることによって行われます。
jwueller、2009

2
そのため、一重引用符を使用しているので、これらの文字をエスケープする必要はありません。\\nひどい見えます。\\\\ 単一のバックスラッシュと一致するのはひどいです。
NullUserException

5

エスケープシーケンス\Rは一般的な改行と一致します

つまり、Unicodeによって改行シーケンスと見なされるものすべてです。\v垂直空白)に一致するすべての文字、および複数文字シーケンス\x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);

8ビットの非UTF-8モード\Rは次と同等(?>\r\n|\n|\x0b|\f|\r|\x85)です:... pcre.org

Regex101デモ


アントンが私の編集に問題がないかどうか確認してください!いくつかの詳細情報を追加しました。
ボブルバブル2017

4

テキストの改行は、一般的に次のように表されます。

\ r \ n -Windowsコンピューター

\ r -Appleコンピュータ

\ n -Linuxの場合

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);

3

何について:

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

私が間違っていなければ、すべてのシステムで\ nが正しく機能しないため、これはかなり堅牢なソリューションになるはずです...


これは\ rを置き換えるのではなく、\ nを置き換えるだけのようです:ideone.com/28KPcb
T30

マニュアルで述べたように、PHP_EOLには現在のプラットフォームに対応する正しい「行末」記号が含まれています。他のプラットフォームから文字列をインポートする場合、またはフォーマットされた文字列が正しくない場合、これは壊れる可能性があります。
GDY

かなり閉じた環境がある場合、これは私にとって最もエレガントなソリューションのようです。プラットフォームに依存せず、おそらくかなりパフォーマンスが高いためです。インポート/エクスポートシナリオのようなより広範な入力がある場合は、おそらく正規表現ソリューションを使用する必要があります。
GDY

3

誰もが正規表現についてほとんど知らないのを見て驚いた。

phpでの改行の除去は

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

Perlで

$str =~ s/\r?\n$/ /g;

意味は、行の終わりにある改行文字(効率を上げるため)-必要に応じて改行を前に付けて-をスペースに置き換えます。

\ nまたは\ 015は改行です。\ rまたは\ 012はキャリッジリターンです。?正規表現では、前の文字の1または0に一致することを意味します。正規表現の$は、行末に一致することを意味します。

オリジナルと最高の正規表現のリファレンスは、すべてのコーダはかなりよく、このドキュメントを知っている必要があります、はperldocはperlreです: http://perldoc.perl.org/perlre.html ないすべての機能は、すべての言語でサポートされています注意してください。


この解決策は私にとってはうまくいきませんでしたが、前述のように、実際の解決策を作成するにはさらに読む必要があります。これが機能しないことに驚いた。
Adam Whateverson

2

これは私が使用するパターンです

$string = preg_replace('@[\s]{2,}@',' ',$string);

2

多分これはうまくいきます:

$str='\n';
echo str_replace('\n','',$str);

1

これもタブを削除します

$string = preg_replace('~[\r\n\t]+~', '', $text);

1

以下のコードを試すと、テキストの空白と改行が保持されます。

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

echo preg_replace( "/\r|\n/", "", $str );


0

以下のコードはすべてのテキストで機能しますので、それを使用してください:

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);

0

新しい行と複数の空白を削除できます。

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

echo $name;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.