strtr() me semble être l'arme idéale pour faire ça:
1 2 3
| $str = "lapin\ntortue\r\ncarotte\nsalade\r\nchat\nchien\r\nsouris\nhérisson";
$result = strtr($str, ["\r\n" => "\r\n", "\n" => '|']); |
La ruse étant de remplacer les CRLF par eux-mêmes car strtr() ne parcourt qu'une fois la chaîne et donne la priorité à la plus grande correspondance.
Sinon dans une regex, il suffit d'utiliser un test arrière négatif (?<!...) pour vérifier qu'il n'y a pas de CR avant le LF:
$result = preg_replace('~(?<!\r)\n~', '|', $str);
Mais à mon avis strtr() sera plus rapide.
Autre méthode plus traditionnelle avec des remplacements successifs: on remplace la partie à protéger par un placeholder avant de remplacer les LFs:
$result = str_replace(['#', "\r\n", "\n", '#!#!', '##'], ['##', '#!#!', '|', "\r\n", '#'], $str);
Partager