web-dev-qa-db-ja.com

複数の改行、タブ、スペースを置き換える

複数の改行文字を1つの改行文字に置き換え、複数のスペースを単一のスペースに置き換えます。

preg_replace("/\n\n+/", "\n", $text);を試しましたが失敗しました!

また、書式設定のために$ textでこの作業を行います。

$text = wordwrap($text, 120, '<br/>', true);
$text = nl2br($text);

$ textはBLOGのためにユーザーから取得した大きなテキストであり、より良い書式設定のためにwordwrapを使用しています。

31
Sourav

理論的には、正規表現は機能しますが、問題はすべてのオペレーティングシステムとブラウザが文字列の最後に\ nしか送信しないことです。多くのユーザーも\ rを送信します。

試してください:

私はこれを簡略化しました:

preg_replace("/(\r?\n){2,}/", "\n\n", $text);

そして、いくつかの送信\ rのみの問題に対処するには:

preg_replace("/[\r\n]{2,}/", "\n\n", $text);

アップデートに基づいて:

// Replace multiple (one ore more) line breaks with a single one.
$text = preg_replace("/[\r\n]+/", "\n", $text);

$text = wordwrap($text,120, '<br/>', true);
$text = nl2br($text);
53

\ R(行末シーケンスを表す)を使用します。

$str = preg_replace('#\R+#', '</p><p>', $str);

ここで見つかりました:2つの新しい行を段落タグで置き換える

エスケープシーケンス に関するPHPドキュメント:

\ R(改行:\ n、\ r、および\ r\nに一致)

33
Armel Larcier

私は質問を理解しているので、これが答えです:

// Normalize newlines
preg_replace('/(\r\n|\r|\n)+/', "\n", $text);
// Replace whitespace characters with a single space
preg_replace('/\s+/', ' ', $text);

これは、改行をHTMLの改行および段落要素に変換するために使用する実際の関数です。

/**
 *
 * @param string $string
 * @return string
 */
function nl2html($text)
{
    return '<p>' . preg_replace(array('/(\r\n\r\n|\r\r|\n\n)(\s+)?/', '/\r\n|\r|\n/'),
            array('</p><p>', '<br/>'), $text) . '</p>';
}
8
Sonny

複数行に一致させるには、複数行修飾子が必要です。

preg_replace("/PATTERN/m", "REPLACE", $text);

また、あなたの例では、2つ以上の改行を正確に2に置き換えているようですが、これはあなたの質問が示すものではありません。

2
Chris Eberle

上記のすべてを試してみましたが、うまくいきませんでした。それから私はその問題を解決するために長い道のりを作成しました...

前 :

echo nl2br($text);

後:

$tempData = nl2br($text);
$tempData = explode("<br />",$tempData);

foreach ($tempData as $val) {
   if(trim($val) != '')
   {
      echo $val."<br />";
   }
}

そしてそれは私のために働いた..誰かが私のような答えを見つけるためにここに来たなら.

1
Shaunak Shukla

複数のタブを単一のタブに置き換えるだけの場合は、次のコードを使用します。

preg_replace("/\s{2,}/", "\t", $string);
1
Heman G

私は次のようなものを提案します:

preg_replace("/(\R){2,}/", "$1", $str);

これにより、すべてのUnicode改行文字が処理されます。

1
anubhava

私はPHPでstrip_tags関数を扱っており、次のようないくつかの問題がありました。 :(。

これはstrip_tagsを処理するための私のソリューションです

複数のスペースを1つに、複数の改行を単一の改行に置き換える

function cleanHtml($html)
{
    // Clean code into script tags
    $html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);

    // Clean code into style tags
    $html = preg_replace('/<\s*style.+?<\s*\/\s*style.*?>/si', '', $html );

    // Strip HTML
    $string = trim(strip_tags($html));

    // Replace multiple spaces on each line (keep linebreaks) with single space
    $string = preg_replace("/[[:blank:]]+/", " ", $string); // (*)

    // Replace multiple spaces of all positions (deal with linebreaks) with single linebreak
    $string = preg_replace('/\s{2,}/', "\n", $string); // (**)
    return $string;
}

キーワードは(*)と(**)です。

0
Hai Nguyen

頭と文字列またはドキュメントの終わりを交換してください!

preg_replace('/(^[^a-zA-Z]+)|([^a-zA-Z]+$)/','',$match);
0
user3129040

これを試して:

preg_replace("/[\r\n]*/", "\r\n", $text); 
0
The Mask