Comment remplacer les différents styles de saut de ligne en PHP façon la plus intelligente?

StackOverflow https://stackoverflow.com/questions/7836632

  •  27-10-2019
  •  | 
  •  

Question

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

Quel est le meilleur moyen de le faire? Mon apparence actuelle de solution comme celle-ci qui est ainsi sucky:

    $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 le faire avec un remplacement parce que le \ r \ n sera dupliqué à \ r \ n \ r \ n.

Merci pour votre aide!

Était-ce utile?

La solution

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

Si vous ne souhaitez pas remplacer tous les sauts de ligne Unicode, mais seulement ceux de style CRLF, utilisez:

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

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


De la PCRE docs :

Qu'est-ce que les matches de \R

Par défaut, la séquence \ R dans un motif correspondant à tout saut de ligne Unicode séquence, ce qui a été sélectionné en tant que séquence de terminaison de ligne. Si vous spécifiez

     --enable-bsr-anycrlf

la valeur par défaut est modifiée de sorte que \ R correspond uniquement CR, LF ou CRLF. Quel que soit sélectionné lorsque PCRE est construit peut être redéfinie si la bibliothèque fonctions sont appelées.

et

Newline séquences

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

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

Ceci est un exemple d'un « groupe atomique », dont les détails sont donnés au dessous de. Ce groupe particulier correspond soit à la séquence de deux caractères CR suivi de LF, ou l'un des caractères uniques LF (saut de ligne, U + 000A), VT (onglet vertical, U + 000B), FF (saut de page, U + 000C), CR (chariot retour, 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 plus grands à 255 sont ajoutés: LS (séparateur de ligne, U + 2028) et PS (de séparateur de paragraphe, U + 2029). Unicode caractère soutien de la propriété est pas nécessaire pour ces caractères à reconnaître.

Il est possible de restreindre \ R pour correspondre seulement CR, LF ou CRLF (au lieu de l'ensemble complet de terminaisons de ligne Unicode) en définissant l'option PCRE_BSR_ANYCRLF soit au moment de la compilation ou lorsque le modèle est mis en correspondance. (BSR est une abréviation pour « R backslash ».) Cela peut être la valeur par défaut lorsque PCRE est construit; si tel est le cas, l'autre comportement peut être demandé par l'option PCRE_BSR_UNICODE. Il est également possible de spécifier ces paramètres en lançant une chaîne de modèle avec l'un des Les séquences ci-dessous:

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

Ces modèles remplacent la valeur par défaut et les options disponibles à pcre_compile () ou pcre_compile2 (), mais ils peuvent être surchargée par des options données à pcre_exec () ou pcre_dfa_exec (). Notez que ces paramètres spéciaux, qui ne sont pas compatibles Perl, sont reconnus seulement au début d'un motif, et qu'ils doivent être en majuscules. Si plus d'un d'entre eux est présent, le dernier est utilisé. Ils peuvent être combinés avec un changement de convention nouvelle ligne; par exemple, un modèle peut commencer par:

    (*ANY)(*BSR_ANYCRLF)

Ils peuvent également être combiné avec le (* UTF8) ou (* UCP) des séquences spéciales. A l'intérieur d'une classe de caractères, \ R est traité comme une évasion non reconnu séquence, et correspond donc à la lettre « R » par défaut, mais provoque une erreur si PCRE_EXTRA est réglé.

Autres conseils

Pour normaliser les nouvelles lignes que j'utilise toujours:

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

Il remplace l'ancien Mac (\r) et les fenêtres (\r\n) avec des sauts de ligne l'équivalent UNIX (\n).

Je preffer en utilisant \n car il ne prend un octet au lieu de deux, mais vous pouvez facilement changer à \r\n.

Qu'en est-

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

Je pense que le plus intelligent / moyen le plus simple de se convertir à CRLF est:

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

pour convertir LF uniquement:

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

il est beaucoup plus facile alors des expressions régulières.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top