J'ai cette ficelle:
var str = "? this is a ? test ?";
Maintenant je veux avoir ceci:
var newstr = "this is a ? test";
Comme vous le voyez, je souhaite supprimer uniquement les ?
entourant (au début et à la fin)} cette chaîne (pas au milieu de la chaîne)}. Comment faire cela en utilisant JavaScript?
Voici ce que j'ai essayé:
var str = "? this is a ? test ?";
var result = str.trim("?");
document.write(result);
Donc, comme vous le voyez, cela ne fonctionne pas. En fait, je suis un développeur PHP et trim()
fonctionne bien dans PHP . Maintenant, je veux savoir si je peux utiliser trim()
pour le faire dans JS.
Il convient de noter je peux le faire en utilisant regex , mais pour être honnête, je déteste regex pour ce type de travail. Quoi qu'il en soit, y a-t-il une meilleure solution?
Edit: Comme cela est mentionné dans le commentaire, je dois supprimer à la fois ?
et les espaces blancs qui entourent la chaîne.
Rechercher un masque de caractère et renvoyer le reste sans.
Cette proposition concerne l'utilisation de l'opérateur bitwise not~
pour la vérification.
~
est un bitwise not operator . Il est parfait pour une utilisation avecindexOf()
, parce queindexOf
renvoie si trouvé l’index0 ... n
et sinon-1
:value ~value boolean -1 => 0 => false 0 => -1 => true 1 => -2 => true 2 => -3 => true and so on
function trim(s, mask) {
while (~mask.indexOf(s[0])) {
s = s.slice(1);
}
while (~mask.indexOf(s[s.length - 1])) {
s = s.slice(0, -1);
}
return s;
}
console.log(trim('??? this is a ? test ?', '? '));
console.log(trim('abc this is a ? test abc', 'cba '));
Une solution possible consisterait à utiliser des fonctions récursives pour supprimer les caractères de début et de fin indésirables. Cela n'utilise pas d'expressions régulières.
function ltrim(char, str) {
if (str.slice(0, char.length) === char) {
return ltrim(char, str.slice(char.length));
} else {
return str;
}
}
function rtrim(char, str) {
if (str.slice(str.length - char.length) === char) {
return rtrim(char, str.slice(0, 0 - char.length));
} else {
return str;
}
}
Bien sûr, ce n’est qu’une des nombreuses solutions possibles. La fonction trim
utiliserait à la fois ltrim
et rtrim
.
La raison pour laquelle char
est le premier argument et la chaîne qui doit être nettoyée le second, est pour faciliter sa modification en une fonction de style de programmation fonctionnelle, comme suit (ES 2015):
function ltrim(char) {
(str) => {
<body of function>
}
}
// No need to specify str here
function ltrimSpaces = ltrim(' ');
Utilisez simplement:
let text = '?? something ? really ??'
text = text.replace(/^([?]*)/g, '')
text = text.replace(/([?]*)$/g, '')
console.log(text)
Voici une façon de le faire qui vérifie les index-hors limites et n'appelle qu'un seul appel à substring
:
String.prototype.trimChars = function(chars) {
var l = 0;
var r = this.length-1;
while(chars.indexOf(this[l]) >= 0 && l < r) l++;
while(chars.indexOf(this[r]) >= 0 && r >= l) r--;
return this.substring(l, r+1);
};
Exemple:
var str = "? this is a ? test ?";
str.trimChars(" ?"); // "this is a ? test"
Approche simple utilisant les fonctions Array.indexOf
, Array.lastIndexOf
et Array.slice
:
Mise à jour: (note: l'auteur a demandé de couper leentourantchars)
function trimChars(str, char){
var str = str.trim();
var checkCharCount = function(side) {
var inner_str = (side == "left")? str : str.split("").reverse().join(""),
count = 0;
for (var i = 0, len = inner_str.length; i < len; i++) {
if (inner_str[i] !== char) {
break;
}
count++;
}
return (side == "left")? count : (-count - 1);
};
if (typeof char === "string"
&& str.indexOf(char) === 0
&& str.lastIndexOf(char, -1) === 0) {
str = str.slice(checkCharCount("left"), checkCharCount("right")).trim();
}
return str;
}
var str = "???? this is a ? test ??????";
console.log(trimChars(str, "?")); // "this is a ? test"
Pas de regex:
uberTrim = s => s.length >= 2 && (s[0] === s[s.length - 1])?
s.slice(1, -1).trim()
: s;
Explication pas à pas:
Au cas où vous seriez dérangé par cette syntaxe, il s’agit d’un Fonction de flèche et d’un opérateur ternaire .
Les parenthèses sont superflues dans le ternaire en passant.
Exemple d'utilisation:
uberTrim(''); // ''
uberTrim(' Plop! '); //'Plop!'
uberTrim('! ...What is Plop?!'); //'...What is Plop?'
pour garder cette question à jour en utilisant une approche ES6:
J'ai bien aimé la méthode bitwise mais quand la lisibilité est aussi une préoccupation, voici une autre approche.
function trimByChar(string, character) {
const first = [...string].findIndex(char => char !== character);
const last = [...string].reverse().findIndex(char => char !== character);
return string.substring(first, string.length - last);
}
La méthode de découpage de Javascript supprime uniquement les espaces et ne prend aucun paramètre. Pour un ajustement personnalisé, vous devrez créer votre propre fonction. Regex constituerait une solution rapide, et vous pouvez trouver une implémentation d'un trim personnalisé sur w3schools au cas où vous ne voudriez pas avoir le temps de suivre le processus de création d'une regex. (il vous suffira de l'ajuster pour filtrer? au lieu d'espaces
Utiliser regex
'? this is a ? test ?'.replace(/^[? ]*(.*?)[? ]*$/g, '$1')
Vous pouvez détester regex mais après avoir trouvé une solution, vous vous sentirez bien :)