syntaxe correcte pour remplacer des occurrences multiples avec preg_replace de PHP

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

  •  18-09-2019
  •  | 
  •  

Question

Je suis allé sur d'autres questions de débordement de la pile avec des idées similaires, mais aucun ne semble ressembler d'assez près ce que je suis en train de le faire.

Cela semble simple, mais je suis dans des conserves au vinaigre. Je suis en train de remplacer plusieurs occurrences d'une rupture de ligne (\n) avec une seule coupure de ligne, afin que les gens ne seront pas en mesure de soumettre plus d'une coupure de ligne à la fois. Voici ce que je l'ai essayé.

$text = "Foo\n\n\nbar!\n\nfoobar!";
$text = preg_replace("#\n+#", "\n", $text);
echo $text;

La déclaration de retour attendu serait:

Foo\nbar!\nfoobar!

Mais pas de cigare! J'ai essayé plusieurs, mais aucun ne semblait fonctionner.

Qu'est-ce que je fais mal?

Merci!

Était-ce utile?

La solution 3

Si vous n'êtes intéressé que par la solution, passez à la dernière ligne.

Voici ce qui a fini par se produire. J'ai eu un tag div en html contenant certaines informations. Lorsqu'un utilisateur frappe un bouton, un code JS court qui convertit que div à une zone de texte input et définit la valeur de cette zone de texte comme html du div d'origine - en remplaçant toutes les occurrences de <br> avec \n pour créer des sauts réels en ligne. Le formulaire a ensuite obtenu soumis via ajax au serveur.

Quand j'ai essayé de remplacer les sauts de ligne en PHP, aucune des suggestions ci-dessus a permis, pour la simple raison qu'il n'était pas (assez curieusement) un « vrai » caractère linebreak. Ce qui se est soumis au serveur a été le \n littéral. Vous penseriez échapper à la barre oblique inverse \n, comme le suggère ghostdog74 résoudrait le problème, mais il ne l'a pas. J'ai essayé échapper plusieurs façons différentes, mais rien ne semblait aider.

J'ai fini par référence à un vieux matériel regex et a constaté que:

  

Beaucoup de saveurs soutiennent également le \ Q ... \ E séquence d'échappement. Tous les caractères entre la \ Q et \ E sont interprétés comme des caractères littéraux. Par exemple. \ Q * \ d + * \ E correspond au texte littéral \ d + . Le \ E peut être omis à la fin de la regex ... Cette syntaxe est prise en charge par le moteur JGsoft, Perl, PCRE ... [source]

Par la suite, voici le morceau de code qui a résolu mon problème:

$text = preg_replace('#[\Q\n\E]+#', "\n", $text);

Merci à tous pour votre aide! +1 pour tous:)

Autres conseils

Vous pouvez également vérifier les trois variétés de sauts de ligne:

$text = "Foo\n\r\n\n\rbar!\n\nfoobar!";
$text = preg_replace('#(\r\n|\r|\n)+#m', "\n", $text);
echo $text;
$text = "Foo\n\n\nbar!\n\nfoobar!";
$s = split("\n+",$text);
print_r( implode("\n",$s)); #this will join the string with newline
print_r( implode("\\n",$s)); # this will have literal \n in your string 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top