web-dev-qa-db-ja.com

余分な空白と改行をPHPで置き換えますか?

$string = "My    text       has so    much   whitespace    




Plenty of    spaces  and            tabs";

echo preg_replace("/\s\s+/", " ", $string);

PHPのドキュメントを読み、preg_replaceのチュートリアルに従いますが、このコードは

テキストに余白がたくさんあるたくさんのスペースとタブ

どうすればそれを変えることができますか:

テキストに余白がたくさんある
十分なスペースとタブ

33
Teiv

まず、オペレーティングシステムに応じて、改行が\ r、\ n、または\ r\nのいずれかになりうることを指摘しておきます。

私の解決策:

echo preg_replace('/[ \t]+/', ' ', preg_replace('/[\r\n]+/', "\n", $string));

必要に応じて、2行に分けることができます。

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

更新

さらに良い解決策はこれです:

echo preg_replace('/[ \t]+/', ' ', preg_replace('/\s*$^\s*/m', "\n", $string));

または:

$string = preg_replace('/\s*$^\s*/m', "\n", $string);
echo preg_replace('/[ \t]+/', ' ', $string);

複数の行を単一行に分割する正規表現を変更しました。 「m」修飾子(^と$を改行の開始と終了に一致させる)を使用し、文字列の末尾と先頭にある\ s(スペース、タブ、改行、改行)文字を削除します。次の。これにより、スペースのみの空行の問題が解決されます。前の例では、行がスペースで埋められていた場合、余分な行をスキップしていました。

47

正しい答えを編集しました。 PHP 5.2.4かそこらから、次のコードは:

echo preg_replace('/\v(?:[\v\h]+)/', '', $string);
9
Harikrishnan Hr

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

$text = preg_replace("/[\r\n]+/", "\n", $text);
$text = preg_replace("/\s+/", ' ', $text);

テスト済み:)

4
Sourav
//Newline and tab space to single space

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


// Multiple spaces to single space ( using regular expression)

$from_mysql = ereg_replace(" {2,}", ' ',$from_mysql);

// Replaces 2 or more spaces with a single space, {2,} indicates that you are looking for 2 or more than 2 spaces in a string.
4
Hoàng Vũ Tgtt

これは、COMPLETELY MINIFY文字列全体(大きなブログ記事など)でありながら、すべてのHTMLタグを所定の位置に保持します。

$email_body = str_replace(PHP_EOL, ' ', $email_body);
    //PHP_EOL = PHP_End_Of_Line - would remove new lines too
$email_body = preg_replace('/[\r\n]+/', "\n", $email_body);
$email_body = preg_replace('/[ \t]+/', ' ', $email_body);
2
Rakib

代替アプローチ:

echo preg_replace_callback("/\s+/", function ($match) {
    $result = array();
    $prev = null;
    foreach (str_split($match[0], 1) as $char) {
        if ($prev === null || $char != $prev) {
            $result[] = $char;
        }

        $prev = $char;
    }

    return implode('', $result);
}, $string);

出力

My text has so much whitespace
Plenty of spaces and tabs

編集:異なるアプローチであるため、これを読み直しました。それはおそらく要求されたものではありませんが、少なくとも異なる空白のグループをマージすることはありません(たとえば、space, tab, tab, space, nl, nl, space, spacespace, tab, space, nl, spaceになります)。

2
Yoshi

試してください:

$string = "My    text       has so    much   whitespace    




Plenty of    spaces  and            tabs";
//Remove duplicate newlines
$string = preg_replace("/[\n]*/", "\n", $string); 
//Preserves newlines while replacing the other whitspaces with single space
echo preg_replace("/[ \t]*/", " ", $string); 
1

なぜあなたはこのようにしているのですか?
htmlでは、複数のスペースを使用しても1つのスペースしか表示されません...

例:

<i>test               content 1       2 3 4            5</i>

出力は次のようになります:
テスト内容1 2 3 4 5

htmlに複数のスペースが必要な場合は、&nbsp;

1
Jagadeesan

これが役に立つかどうかも定かではありません。

複数のスペースおよびその他の必要または不要なものをクリアし、1行の文字列または複数行の文字列(渡された引数/オプションに応じて)を生成する関数。他の言語の文字を削除または保持し、改行タブをスペースに変換することもできます。

/** ¯\_(ツ)_/¯ Hope it's useful to someone. **/
// If $multiLine is null this removes spaces too. <options>'[:emoji:]' with $l = true allows only known emoji.
// <options>'[:print:]' with $l = true allows all utf8 printable chars (including emoji).
// **** TODO: If a unicode emoji or language char is used in $options while $l = false; we get an odd � symbol replacement for any non-matching char. $options char seems to get through, regardless of $l = false ? (bug (?)interesting)
function alphaNumericMagic($value, $options = '', $l = false, $multiLine = false, $tabSpaces = "    ") {
    $utf8Emojis = '';
    $patterns = [];
    $replacements = [];
    if ($l && preg_match("~(\[\:emoji\:\])~", $options)) {
        $utf8Emojis = [
            '\x{1F600}-\x{1F64F}', /* Emoticons */
            '\x{1F9D0}-\x{1F9E6}',
            '\x{1F300}-\x{1F5FF}', /* Misc Characters */ // \x{1F9D0}-\x{1F9E6}
            '\x{1F680}-\x{1F6FF}', /* Transport and Map */
            '\x{1F1E0}-\x{1F1FF}' /* Flags (iOS) */
        ];
        $utf8Emojis = implode('', $utf8Emojis);
    }
    $options = str_replace("[:emoji:]", $utf8Emojis, $options);
    if (!preg_match("~(\[\:graph\:\]|\[\:print\:\]|\[\:punct\:\]|\\\-)~", $options)) {
        $value = str_replace("-", ' ', $value);
    }
    if ($l) {
        $l = 'u';
        $options = $options . '\p{L}\p{N}\p{Pd}';
    } else { $l = ''; }
    if (preg_match("~(\[\:print\:\])~", $options)) {
        $patterns[] = "/[ ]+/m";
        $replacements[] = " ";
    }
    if ($multiLine) {
        $patterns[] = "/(?<!^)(?:[^\r\na-z0-9][\t]+)/m";
        $patterns[] = "/[ ]+(?![a-z0-9$options])|[^a-z0-9$options\s]/im$l";
        $patterns[] = "/\t/m";
        $patterns[] = "/(?<!^)$tabSpaces/m";
        $replacements[] = " ";
        $replacements[] = "";
        $replacements[] = $tabSpaces;
        $replacements[] = " ";
    } else if ($multiLine === null) {
        $patterns[] = "/[\r\n\t]+/m";
        $patterns[] = "/[^a-z0-9$options]/im$l";
        $replacements = "";
    } else {
        $patterns[] = "/[\r\n\t]+/m";
        $patterns[] = "/[ ]+(?![a-z0-9$options\t])|[^a-z0-9$options ]/im$l";
        $replacements[] = " ";
        $replacements[] = "";
    }
    echo "\n";
    print_r($patterns);
    echo "\n";
    echo $l;
    echo "\n";
    return preg_replace($patterns, $replacements, $value);
}

使用例:

echo header('Content-Type: text/html; charset=utf-8', true);
$string = "fjl!sj\nfl _  sfjs-lkjf\r\n\tskj 婦女與環境健康 fsl \tklkj\thl jhj ⚧???? lkj ⸀ skjfl gwo lsjowgtfls s";
echo "<textarea style='width:100%; height:100%;'>";
echo alphaNumericMagic($string, '⚧', true, null);
echo "\n\nAND\n\n";
echo alphaNumericMagic($string, '[:print:]', true, true);
echo "</textarea>";

結果::

fjlsjflsfjslkjfskj婦女與環境健康fslklkjhljhj⚧lkjskjflgwolsjowgtflss

AND

fjl!sj
fl _ sfjs-lkjf
    skj 婦女與環境健康 fsl klkj hl jhj ⚧???? lkj ⸀ skjfl gwo lsjowgtfls s
0
Eric Shoberg