103 votes

Expression régulière en javascript : supprimer la première et la dernière barre oblique

J'ai ces chaînes de caractères en javascript :

/banking/bonifici/italia
/banking/bonifici/italia/

et je voudrais enlever le premier et le dernier slash s'il existe.

J'ai essayé ^\/(.+)\/?$ mais ça ne marche pas.

En lisant quelques messages sur stackoverflow, j'ai découvert que php possède une fonction trim et que je pouvais utiliser sa traduction en javascript ( http://phpjs.org/functions/trim :566) mais je préférerais une expression régulière "simple".

235voto

KennyTM Points 232647
return theString.replace(/^\/|\/$/g, '');

"Remplacer tous les ( /.../g ) barre oblique ( ^\/ ) ou ( | ) barre oblique ( \/$ ) avec une chaîne vide".

26 votes

Je l'ai modifié pour supprimer tout nombre de barres obliques de début ou de fin, en utilisant "+" : replace(/^\/+|\/+$/g, '')

0 votes

Et si la chaîne de caractères est //www.google.com ? // seront manqués.

0 votes

@IsaacFerreira vous pouvez utiliser celui-là. /^\s*\/*\s*|\s*\/*\s*$/gm il prend en compte les éventuels espaces avant et après les barres obliques et les barres obliques multiples qui ajoutent les *.

39voto

Daniel Vandersluis Points 30498

Il n'y a pas vraiment de raison d'utiliser une regex ici, les fonctions de chaîne de caractères feront l'affaire :

var string = "/banking/bonifici/italia/";
if (string.charAt(0) == "/") string = string.substr(1);
if (string.charAt(string.length - 1) == "/") string = string.substr(0, string.length - 1);
// string => "banking/bonifici/italia"

Voyez cela en action sur jsFiddle .

Références :

4 votes

Je pense que parfois, éviter les regexp peut aider à la lisibilité, mais dans ce cas, utiliser une ligne de regexp et une ligne de commentaire fera le travail d'une manière beaucoup plus élégante.

3 votes

Cela ne supprimera pas les barres obliques en double au début ou à la fin de la chaîne ("//banking/bon/ita//"), ce que fera une regex comme replace(/^\/+|\/+$/g, '').

0 votes

Je ne pense même pas que cela contribue à améliorer la lisibilité, cela devient juste un test pour savoir dans quelle mesure quelqu'un peut comprendre les regex ou non. Je pense que la plupart des gens peuvent dire ce que fait /^\/|\/$/g après quelques secondes, surtout dans le contexte d'un autre code non regex. Donc, dans ce cas, la regex est meilleure, selon moi.

9voto

Damaged Organic Points 4473

Dans le cas où l'utilisation de RegExp est pas une option Si vous avez besoin d'un traitement supplémentaire, ou si vous devez gérer des cas particuliers en travaillant avec des URL (tels que des doubles/triples barres obliques ou des lignes vides sans remplacement complexe), ou si vous utilisez un traitement supplémentaire, voici une solution moins évidente, mais plus fonctionnelle :

const urls = [
  '//some/link///to/the/resource/',
  '/root',
  '/something/else',
];

const trimmedUrls = urls.map(url => url.split('/').filter(x => x).join('/'));

console.log(trimmedUrls);

Dans cet extrait filter() peut mettre en œuvre une logique plus complexe que le simple filtrage des chaînes vides (qui est le comportement par défaut).

Attention, il n'est pas aussi rapide que les autres extraits présentés ici.

5voto

Maciej Krawczyk Points 4533

Une seule ligne, pas de regex, gère les occurrences multiples.

const trimSlashes = str => str.split('/').filter(v => v !== '').join('/');

console.log(trimSlashes('/some/path/foo/bar///')); // "some/path/foo/bar"

3voto

yckart Points 7517

Juste au cas où quelqu'un aurait besoin d'un optimisation prématurée ici...

http://jsperf.com/remove-leading-and-trailing-slashes/5

var path = '///foo/is/not/equal/to/bar///'
var count = path.length - 1
var index = 0

while (path.charCodeAt(index) === 47 && ++index);
while (path.charCodeAt(count) === 47 && --count);

path = path.slice(index, count + 1)

0 votes

@benraay avez-vous besoin d'aide pour le comprendre ?

0 votes

@MilenGeorgiev non merci je disais juste que cette version du code est moins lisible que celle avec RegEx ils sont parfois difficiles à comprendre mais theString.replace(/^\/|\/$/g, '') est vraiment simple et facile à comprendre pour les personnes qui lisent le code, mais probablement plus lent que celui-ci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X