J'ai donc cette fonction que j'ai créée qui remplace les caractères spéciaux qui se trouvent à l'intérieur d'une chaîne. L'intention principale était de remplacer les caractères spéciaux qui se trouvaient à l'intérieur de la balise BBCode ([code=any]mon code que je veux afficher[/code]), mais à l'époque, cela n'avait pas vraiment d'importance si cela remplaçait le reste de la chaîne en dehors de la balise BBcode. Mais maintenant, j'ai des problèmes avec le remplacement des balises HTML qui sont en dehors de la balise BBcode. J'essayais donc de trouver une solution pour cela, mais sans succès jusqu'à présent.

Le but est de remplacer les caractères spéciaux qui se trouvent à l'intérieur de :

[code=any]some code inside of here[/code]

Il faut également mentionner que lorsque je dis code = tout sens, cela peut être n'importe quoi. Il peut s'agir de HTML, CSS, PHP, JS [a-z-A-Z-0-9].

Donc plus comme

[code=[a-z-A-Z-0-9]<h1>some html insode of the bbcode to be replace</h1>[/code]

Ma fonction actuelle est simple. Juste quelques expressions régulières de base sont nécessaires :

replaceSpecial : function(str) {

str = str.replace(/&/g, "&amp;");
str = str.replace(/>/g, "&gt;");
str = str.replace(/</g, "&lt;");
str = str.replace(/"/g, "&quot;");
str = str.replace(/'/g, "&#039;");

return str;
}

Mais comment pourrais-je réécrire cela pour qu'il ne remplace que le texte qui se trouve à l'intérieur du: [code=any]du code à l'intérieur ici[/code] et c'est tout. Si quelqu'un a une solution pour cela, ce serait génial.

Merci pour votre temps, Jon W

2
Jon W 17 mars 2019 à 06:45

2 réponses

Meilleure réponse

Voulez-vous extraire le texte à l'intérieur d'un code-barres et appliquer cette expression régulière, vous pouvez utiliser exec pour simplement appliquer le remplacement à ce qui est à l'intérieur du code, pouvez utiliser Capturer des groupes et des références arrière voir plus de lien https://www.regular-expressions.info/refcapture.html

Dans ce cas, récupérez uniquement le texte de l'intérieur du bbcode et traitez-le

let code = "[code=any]<h1>hello and bye</h1>e[/code]";
//extract only texto inside bbcode
let match = /\[code\=any\](.+)\[\/code\]/g.exec(code)[1];
//get <h1>hello</h1>e
let replacement = myObj.replaceSpecial(match);

enter image description here

Voir https://regex101.com/r/KGCWmq/1

Ce ne serait que si vous voulez obtenir, si vous voulez remplacer, vous pouvez utiliser la fonction de remplacement.

var myObj = {
    replaceSpecial : function(str) {
        str = str.replace(/&/g, "&amp;");
        str = str.replace(/>/g, "&gt;");
        str = str.replace(/</g, "&lt;");
        str = str.replace(/"/g, "&quot;");
        str = str.replace(/'/g, "&#039;");
        return str;
    }
};
let code = "[code=any]<h1>hello and bye</h1>e[/code]";
let match = /\[code\=any\](.+)\[\/code\]/g.exec(code)[1];
let replacement = myObj.replaceSpecial(match);
let string = code.replace(/\[code\=any\](.+)\[\/code\]/,"[code=any]"+replacement+"[/code]")

MISE À JOUR

D'après la réponse de Wiktor Stribżew, l'expression régulière peut être validée pour que le bbcode soit n'importe

myObj = {
  replaceSpecial : function(str) {
     return str.replace(/&/g, "&amp;")
               .replace(/>/g, "&gt;")
               .replace(/</g, "&lt;")
               .replace(/"/g, "&quot;")
               .replace(/'/g, "&#039;");
  }
}

var s = '[code="HTML"]<h1>Hello</h1>[/code]';
var regex = /(\[code=[^\]]*])([^]*?)(\[\/code])/gi;
console.log( s.replace(regex, function($0, $group_match1, $group_match2, $group_match3) { return $group_match1 + myObj.replaceSpecial($group_match2) + $group_match3; }) );

J'espère vous avoir aidé et si ce n'est pas ce que vous attendez, faites un commentaire et modifiez la question

2
Herman Andres Figueroa 17 mars 2019 à 15:01

Si vous n'avez pas de balises code imbriquées, vous pouvez utiliser

/(\[code=[^\]]*])([^]*?)(\[\/code])/gi

Ou, si vous rencontrez des problèmes avec cette performance regex, remplacez-la par son équivalent écrit selon le unroll-the-loop principe :

/(\[code=[^\]]*])([^[]*(?:\[(?!\/code])[^[]*)*)(\[\/code])/gi

Voir la démo regex (et la démo regex optimisée).

Détails

  • (\[code=[^\]]*]) - Groupe 1 : [code= puis tout caractère 0+ autre que ] puis ]
  • ([^]*?) - Groupe 2 : 0 caractère ou plus, le moins possible (*? est un *quantificateur non gourmand)
  • (\[\/code]) - Groupe 3 : sous-chaîne [/code].

Utilisez-le dans un String#replace comme ceci :

function replaceSpecial(str) {
  return str.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
}

var s = '[code="JS"]<p align="center">D&elete the "Go" \'icon\'.</h1>[/code]';
var regex = /(\[code=[^\]]*])([^]*?)(\[\/code])/gi;
console.log( s.replace(regex, function($0, $1, $2, $3) { return $1 + replaceSpecial($2) + $3; }) );

Remarque : si vous devez exclure [code= entre [code= et [/code], vous devrez ajuster l'expression régulière pour

/(\[code=[^\]]*])([^[]*(?:\[(?!\/?code[\]=])[^[]*)*)(\[\/code])/gi

Voir cette démo regex.

1
Wiktor Stribiżew 17 mars 2019 à 11:00