web-dev-qa-db-fra.com

Comment remplacer différents styles de nouvelle ligne dans PHP le moyen le plus intelligent?

J'ai un texte qui peut avoir différents styles de nouvelle ligne . Je souhaite remplacer toutes les nouvelles lignes '\ r\n', '\ n', '\ r' par la même nouvelle ligne (\ r\n).

Quel est le moyen le plus rapide de faire cela? Ma solution actuelle ressemble à ceci:

    $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 que vous ne pouvez pas faire cela avec un remplacement car le\r\n sera dupliqué sur\r\n\r\n.

Merci de votre aide!

31
Carsten Schmitz
$string = preg_replace('~\R~u', "\r\n", $string);

Si vous ne souhaitez pas remplacer toutes les nouvelles lignes Unicode, mais uniquement celles de style 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 comme UTF-8.


À partir de Documents PCRE :

Quel \R correspond à

Par défaut, la séquence\R dans un modèle correspond à n’importe quelle nouvelle ligne Unicode séquence, tout ce qui a été sélectionné comme séquence de fin de ligne. Si vous spécifiez

     --enable-bsr-anycrlf

la valeur par défaut est modifiée pour que\R ne corresponde qu'à CR, LF ou CRLF. Tout ce qui est sélectionné lors de la construction de PCRE peut être remplacé par la bibliothèque les fonctions sont appelées.

et

Séquences Newline

En dehors d'une classe de caractères, par défaut, la séquence d'échappement\R correspond à toute séquence de nouvelle ligne Unicode. En mode non-UTF-8,\R est équivalent à Suivant:

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

Ceci est un exemple de "groupe atomique", dont les détails sont donnés au dessous de. Ce groupe particulier correspond à la séquence de deux caractères CR suivi de LF ou de l’un des caractères uniques LF (saut de ligne, U + 000A), VT (onglet vertical, U + 000B), FF (avance de formulaire, U + 000C), CR (chariot __. return, U + 000D) ou NEL (ligne suivante, U + 0085). La séquence de deux caractères est traité comme une seule unité qui ne peut pas être divisée.

En mode UTF-8, deux caractères supplémentaires dont les points de code sont supérieurs plus de 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 de caractère Unicode n'est pas nécessaire pour ces caractères à reconnaître.

Il est possible de restreindre\R à une correspondance avec seulement CR, LF ou CRLF (au lieu de L'ensemble complet de fins de ligne Unicode) en définissant l'option PCRE_BSR_ANYCRLF au moment de la compilation ou lorsque le motif est mis en correspondance . (BSR est l'abréviation de "backslash R".) Cela peut être défini par défaut quand PCRE est construit; si tel est le cas, l'autre comportement peut être demandée via l'option PCRE_BSR_UNICODE. Il est également possible de spécifiez ces paramètres en démarrant une chaîne de modèle avec l’un des fichiers séquences suivantes:

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

Ceux-ci remplacent les valeurs par défaut et les options données à pcre_compile () ou pcre_compile2 (), mais ils peuvent être remplacés par les options données à pcre_exec () ou pcre_dfa_exec (). Notez que ces paramètres spéciaux, qui ne sont pas compatibles Perl, sont reconnus uniquement au tout début d'un motif, et qu'ils doivent être en majuscule. Si plus d'un d'entre eux est présent, le dernier est utilisé. Ils peuvent être combinés avec un changement de convention de nouvelle ligne; Par exemple, un motif peut commencer par:

    (*ANY)(*BSR_ANYCRLF)

Ils peuvent également être combinés avec les séquences spéciales (* UTF8) ou (* UCP) . Dans une classe de caractères,\R est traité comme un d'échappement non reconnu donc correspond à la lettre "R" par défaut, mais provoque une erreur si PCRE_EXTRA est défini.

81
NikiC

Pour normaliser les nouvelles lignes j'utilise toujours:

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

Il remplace l'ancien (\r) Mac et les nouvelles lignes Windows (\r\n) par l'équivalent Unix (\n).

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

12
Alix Axel

Que diriez-vous

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

je pense que le moyen le plus simple/intelligent de convertir en CRLF est:

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

convertir en LF uniquement:

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

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

1
Roey