Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

120
Visualizações
Reemplace varios marcadores de posición con sus valores correspondientes en la cadena

Tengo un comando para hacer un mensaje de bienvenida personalizado, de modo que cuando alguien dice que cambia el título al marcador de posición personalizado {user.id} , cambiaría el título a la ID de los usuarios que se unen

${(cardText, placeholders)} pero eso solo devuelve [objeto Objeto] en la inserción

Entonces, cardText es {user.tag} , así que quiero que busque en los placeholders de posición y vea si hay un marcador de posición en la cadena y si lo hay, cámbielo al valor correcto, por lo que en este caso lo cambiaría a member.user.tag.

Código:

 module.exports = async (client, member) => { const guildSchema = require('../../models/guildSchema'); const data = await guildSchema.findOne({ id: member.guild.id }); const placeholders = { '{client.avatar}': client.user.displayAvatarURL(), '{client.username}': client.user.username, '{client.mention}': client.user, '{client.tag}': client.user.tag, '{client.id}': client.user.id, '{user.avatar}': member.user.displayAvatarURL(), '{user.username}': member.user.username, '{user.mention}': member.user, '{user.tag}': member.user.tag, '{user.id}': member.user.id, '{guild.memberCount}': member.guild.memberCount, '{guild.icon}': member.guild.iconURL, '{guild.name}': member.guild.name, '{guild.id}': member.guild.id, }; const cardTitle = (data.welcome.title === null) ? 'Welcome To The Server' : data.welcome.title; const cardText = (data.welcome.text === null) ? '{user.tag}' : data.welcome.text; const cardSubtitle = (data.welcome.subtitle === null) ? 'Member Count: {guild.memberCount}' : data.welcome.text; const embed = new Discord.MessageEmbed() .setTitle(`${(cardTitle, placeholders)}`), .setDescription(`${(cardText, placeholders)}`), .setFooter(`${(cardSubtitle, placeholders)}`), channel.send({ embeds: [embed] }); }
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

El problema con el código de OP era que el ejemplo que estaban siguiendo tenía algunas convenciones que permitían a los usuarios tener plantillas en el texto de su mensaje indicado por {} .

Por ejemplo, en 'Member Count: {guild.memberCount}' , {guild.memberCount} se reemplazaría para darnos 'Member Count: 123' o algo así.

Pero la función para reemplazar estos marcadores de posición faltaba en su origen.

Por lo tanto, una función de análisis como:

 const replacePlaceholder = (template, placeholders) => { //if there is no placeholder, return. if (template.indexOf('{') === -1) return template; //get the string inside the {} const toReplace = template.slice( template.indexOf('{'), template.indexOf('}') + 1 ); //keep replacing until { character is not found. return replacePlaceholder( template.replace(toReplace, placeholders[toReplace]), placeholders ); };

era necesario. En este contexto, también tiene sentido por qué OP estaba usando:

 const embed = new Discord.MessageEmbed() .setTitle(`${(cardTitle, placeholders)}`), .setDescription(`${(cardText, placeholders)}`), .setFooter(`${(cardSubtitle, placeholders)}`),

Originalmente eran llamadas a funciones como:

 const embed = new Discord.MessageEmbed() .setTitle(`${replacePlaceholder(cardTitle, placeholders)}`), .setDescription(`${replacePlaceholder(cardText, placeholders)}`), .setFooter(`${replacePlaceholder(cardSubtitle, placeholders)}`),
about 4 years ago · Juan Pablo Isaza Relatório

0

Usemos expresiones regulares para hacer la comparación por nosotros. Debido a que sus claves tienen caracteres que tienen un significado especial en las expresiones regulares ( { y } ), necesitaremos escaparlos.

Extraído de escape-string-regexp :

 const escapeRegex = (string) => string .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') .replace(/-/g, '\\x2d');

Luego, escribamos una función que tome una plantilla y los marcadores de posición. Deberíamos crear una expresión regular a partir del marcador de posición como esta:

 const regex = new RegExp("(" + Object.keys(placeholders).map(escapeRegex).join("|") + ")", "g");

Para cada clave en el objeto de marcadores de posición, escapamos de los caracteres especiales y lo unimos todo con | , envolviendo el resultado entre paréntesis. Luego le damos la bandera g (global) para que nos proporcione todas las coincidencias.

Para usted, esta expresión regular generada se vería así:

 /(\{client.avatar\}|\{client.username\}|...|\{guild.id\})/g

Por último, queremos usar esta expresión regular y reemplazar todas las apariciones de marcadores de posición con su valor correspondiente.

 return template.replace(regex, (_, match) => placeholders[match]);

Así que el código completo se ve así:

 const escapeRegex = (string) => string .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') .replace(/-/g, '\\x2d'); function fill(template, placeholders) { const regex = new RegExp("(" + Object.keys(placeholders).map(escapeRegex).join("|") + ")", "g"); return template.replace(regex, (_, match) => placeholders[match]); }

Ejemplo de uso:

 fill("My name is {name}!", { "{name}": "Kelly" }); // "My name is Kelly!"

Puede probarlo aquí , simplemente haga clic en el enlace y presione "Ejecutar". A la derecha verás la salida.


¿Por qué no usamos algo como esto?

 template .replaceAll("{client.avatar}", placeholders["{client.avatar}"]) .replaceAll("{client.username}", placeholders["{client.username}"]) .replaceAll(...) // ...

Bueno, antes que nada, eso no es realmente SECO, ¿verdad? Podrías ayudar con eso usando un bucle:

 for (const [place, value] of Object.entries(placeholders)) { template = template.replaceAll(place, value); }

¡Pero luego hay una trampa! ¿Qué pasa si el valor de un marcador de posición contiene otro marcador de posición? ¡Entonces reemplazaría el nuevo marcador de posición con un nuevo valor! Esto podría conducir a un comportamiento inesperado, por lo que sugerí usar esta solución en su lugar; reemplace todas las coincidencias a la vez, evitando que esto suceda.

Marcadores de posición:

 {bar} => i love {foo} {foo} => 42

Y entonces:

 say {bar} say i love {foo} say i love 42

¡UH oh!

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda