web-dev-qa-db-fra.com

Remplacer les espaces blancs et les sauts de ligne en excès par PHP?

$string = "My    text       has so    much   whitespace    




Plenty of    spaces  and            tabs";

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

J'ai lu la documentation de PHP et je suis le tutoriel de preg_replace, cependant ce code produit

Mon texte a tellement d'espaces Beaucoup d'espaces et d'onglets

Comment puis-je le transformer en:

Mon texte a tellement d'espace
Beaucoup d'espaces et de tabulations

33
Teiv

Tout d'abord, je voudrais souligner que les nouvelles lignes peuvent être soit\r,\n ou\r\n selon le système d'exploitation.

Ma solution:

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

Qui pourrait être séparé en 2 lignes si nécessaire:

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

Mise à jour:

Une solution encore meilleure serait celle-ci:

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

Ou:

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

J'ai changé l'expression régulière qui rend plusieurs sauts de lignes en un seul meilleur. Il utilise le modificateur "m" (qui fait que ^ et $ correspondent au début et à la fin des nouvelles lignes) et supprime tous les caractères\s (espace, tabulation, nouvelle ligne, saut de ligne) qui sont la fin d'une chaîne et le début du suivant. Cela résout le problème des lignes vides qui n'ont que des espaces. Avec mon exemple précédent, si une ligne était remplie d'espaces, elle aurait sauté une ligne supplémentaire.

47
Francois Deschenes

Modifié la bonne réponse. Depuis PHP 5.2.4 ou plus, le code suivant fera l'affaire:

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

Remplacer plusieurs sauts de ligne, tabulation, espace

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

Testé :)

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

cela --- COMPLÈTEMENT MINIFIER toute la chaîne (comme un grand article de blog) tout en préservant toutes les balises HTML en place.

$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

Approche alternative:

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

Sortie :

My text has so much whitespace
Plenty of spaces and tabs

Edit : lu de nouveau car il s'agit d'une approche différente. Ce n'est probablement pas ce qui est demandé, mais cela ne fusionnera pas au moins des groupes d'espaces blancs différents (par exemple space, tab, tab, space, nl, nl, space, space deviendrait space, tab, space, nl, space).

2
Yoshi

essayez avec:

$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
Tudor Constantin

pourquoi tu fais comme ça?
html affiche un seul espace même si vous utilisez plus d'un espace ...

Par exemple:

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

La sortie sera:
contenu du test 1 2 3 4 5

si vous avez besoin de plus d'un seul espace en html, vous devez utiliser &nbsp;

1
Jagadeesan

Je ne sais pas si cela sera utile et je ne suis pas absolument sûr que cela fonctionne comme il se doit, mais cela semble fonctionner pour moi.

Une fonction qui efface plusieurs espaces et tout ce que vous voulez ou ne voulez pas et produit soit une chaîne de ligne unique soit une chaîne de plusieurs lignes (en fonction des arguments/options passés). Peut également supprimer ou conserver des caractères pour d'autres langues et convertir des tabulations de nouvelle ligne en espaces.

/** ¯\_(ツ)_/¯ 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);
}

Exemple d'utilisation:

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>";

Résultats en:

fjlsjflsfjslkjfskj婦女與環境健康fslklkjhljhj⚧lkjskjflgwolsjowgtflss

AND

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