40 votes

Comment remplacer les différents styles de sauts de ligne en PHP de la manière la plus intelligente ?

J'ai un texte qui peut avoir différents styles de nouvelles lignes. Je veux remplacer toutes les nouvelles lignes ' \r\n ', ' \n ',' \r ' avec le même point de suspension (dans ce cas \r\n ).

Quel est le moyen le plus rapide d'y parvenir ? Ma solution actuelle ressemble à ceci, ce qui est vraiment nul :

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

Le problème est qu'il n'est pas possible de le faire avec un seul remplacement, car le \r\n sera dupliqué dans \r\n\r\n .

Merci pour votre aide !

100voto

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

Si vous ne voulez pas remplacer toutes les nouvelles lignes Unicode mais seulement celles de type CRLF, utilisez :

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

\R correspond à ces nouvelles lignes, u est un modificateur permettant de traiter la chaîne d'entrée en UTF-8.


Desde el Docs PCRE :

Ce qu'il faut faire \R correspondances

Par défaut, la séquence \R dans un motif correspond à n'importe quel newlin Unicode quelle que soit la séquence sélectionnée comme séquence de fin de ligne. [ ] vous spécifiez

     --enable-bsr-anycrlf

la valeur par défaut est modifiée de manière à ce que \R ne correspond qu'à CR, LF ou CRLF. Ce qui est sélectionné lors de la construction de PCRE peut être remplacé lorsque la bibliothèque sont appelées.

y

Séquences de retours à la ligne

En dehors d'une classe de caractères, par défaut, la séquence d'échappement \R m toute séquence de nouvelles lignes Unicode. En mode non-UTF-8 \R i suivante :

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

Il s'agit d'un exemple de "groupe atomique", dont les détails sont donnés ci-dessous. ci-dessous. Ce groupe particulier correspond soit à la séquence de deux caractères CR suivie de LF, soit l'un des caractères LF (saut de ligne, U+000A), VT (tabulation verticale, U+000B), FF (saut de page, U+000C), CR (retour chariot, U+000D), CR (saut de page, U+000D), CR (saut de page, U+000D). retour chariot, U+000D) ou NEL (ligne suivante, U+0085). La séquence de deux caractères est traitée comme une unité unique qui ne peut être divisée.

En mode UTF-8, deux caractères supplémentaires dont les points de code sont supérieurs à 255 sont ajoutés : LS (séparateur de ligne, U+2028) et PS (séparateur de paragraphe, U+2029). La prise en charge des propriétés des caractères Unicode n'est pas nécessaire pour que ces caractères soient pris en compte. pour que ces caractères soient reconnus.

Il est possible de restreindre \R pour ne faire correspondre que CR, LF l'ensemble des fins de ligne Unicode) en définissant l'option PCRE_BSR_ANYCRLF soit au moment de la compilation, soit lors de la recherche du motif. (BSR est une abréviation de "backslash R".) Cette option peut être définie par défaut lorsque PCRE est construit ; si c'est le cas, l'autre comportement peut être l'option PCRE_BSR_UNICODE. Il est également possible de spécifier ces paramètres en commençant une chaîne de caractères par l'une des séquences suivantes :

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

Ces options remplacent les options par défaut et les options données à pcre_compile() ou à pcre_compile2(), mais elles peuvent être remplacées par o pcre_exec() ou pcre_dfa_exec(). Notez que ces paramètres spéciaux, qui ne sont pas compatibles avec Perl, ne sont reconnus qu'au tout début d'un et qu'ils doivent être en majuscules. Si plusieurs d'entre eux sont présents, c'est le dernier qui est utilisé. Ils peuvent être combinés avec un changement de par exemple, un motif peut commencer par :

    (*ANY)(*BSR_ANYCRLF)

Ils peuvent également être combinés avec les spécifications (*UTF8) ou (*UCP). A l'intérieur d'une classe de caractères, \R est traitée comme une unr et correspond donc à la lettre "R" par défaut, mais provoque une erreur si PCRE_EXTRA est défini.

18voto

Alix Axel Points 63455

Pour normaliser les nouvelles lignes, j'utilise toujours :

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

Il remplace l'ancien système Mac ( \r ) et le système Windows ( \r\n ) avec l'équivalent Unix ( \n ).

Je préfère utiliser \n parce qu'il ne prend qu'un octet au lieu de deux, mais vous pouvez facilement le changer en \r\n .

10voto

Tomalak Points 150423

Pourquoi pas

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

5voto

Roey Points 21

Je pense que la façon la plus intelligente et la plus simple de convertir en CRLF est la suivante :

$output = str_replace("\n", "\r\n", str_replace("\r", '', $input));

pour convertir en LF uniquement :

$output = str_replace("\r", '', $input);

c'est beaucoup plus facile que les expressions régulières.

0voto

Nixon Kosgei Points 79
$sNicetext = str_replace(["\r\n", "\r"], "\n", $sNicetext);

fonctionne également

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X