Question

Lors du test de réponse question d'un autre utilisateur j'ai trouvé quelque chose que je ne sais pas comprendre. Le problème était de remplacer tous les caractères \t de \n de \r littérale d'une chaîne avec un seul espace.

, le premier modèle que j'ai essayé était:

/(?:\\[trn])+/

qui étonnamment ne fonctionne pas. J'ai essayé le même modèle en Perl et il a bien fonctionné. Après quelques essais et erreurs, j'ai trouvé que PHP veut 3 ou 4 antislashs pour ce motif pour correspondre, comme dans:

/(?:\\\\[trn])+/

ou

/(?:\\\[trn])+/

ces motifs - à ma grande surprise - à la fois le travail. Pourquoi ces antislashs supplémentaires nécessaires?

Était-ce utile?

La solution

Vous avez besoin 4 antislashs pour représenter 1 à regex parce que:

  • 2 barres obliques inverses sont utilisés pour déséchapper dans une chaîne ("\\\\" -> \\)
  • 1 barre oblique inverse est utilisé pour déséchapper dans le moteur de regex (\\ -> \)

A partir de la doc PHP,

  

échappant à tout autre caractère se traduira par la barre oblique inverse en cours d'impression trop 1

Par conséquent, pour \\\[,

  • 1 barre oblique inverse est utilisé pour le déséchapper \, un séjour car \[ est invalide ("\\\[" -> \\[)
  • 1 barre oblique inverse est utilisé pour déséchapper dans le moteur de regex (\\[ -> \[)

Oui cela fonctionne, mais pas une bonne pratique.

Autres conseils

Ses œuvres en Perl parce que vous passez que directement comme motif regex /(?:\\[trn])+/

mais en php, vous devez passer sous forme de chaîne, si besoin échapper supplémentaire pour backslash lui-même.

"/(?:\\\\[trn])+/"
  

Le regex \ pour correspondre à un seul   backslash deviendrait « / \\\\ / » comme    PHP chaîne preg

L'expression régulière juste /(?:\\[trn])+/. Mais puisque vous devez les backslashs dans les déclarations de chaîne ainsi, chaque barre oblique inverse doit être exprimé avec \\:

"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'

Juste trois backspaces ne fonctionnent aussi parce que PHP ne connaît pas la séquence d'échappement \[ et l'ignore. Alors \\ deviendra \ mais \[ restera \[.

Utilisez str_replace!

$code = str_replace(array("\t","\n","\r"),'',$code);

devrait faire l'affaire

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