RegEx para unir palabras envueltas entre llaves
-
08-07-2019 - |
Pregunta
En javascript, tengo un bloque de HTML como este:
<h2>{title}</h2>
<p><a href="{url}">{content}</a></p>
Y estoy intentando usar regex " match " para escupir una matriz de todos los {item}. Entonces mi salida debería verse así:
['title', 'url', 'content']
He llegado hasta:
var pattern = new RegExp("\{[a-zA-Z]+\}+");
var match = pattern.exec("{Sample} bob {text}");
Pero solo devuelve la primera etiqueta.
Esto está más allá de mis habilidades de expresión regular. ¿Alguien puede ayudar?
¡Salud!
Solución
Necesita crear un patrón con la bandera global:
var pattern = new RegExp("\{[a-zA-Z]+\}", "g");
o:
var pattern = /\{[a-zA-Z]+\}/g;
Entonces puede llamar al método match () en su cadena para obtener una lista de coincidencias:
var matches = "{Sample} bob {text}".match(pattern);
Otros consejos
Creo que quieres:
var pattern = new RegExp("\{[a-zA-Z]+\}+", "g");
La segunda opción es una bandera que le indica que busque la cadena completa y devuelva todas las coincidencias.
Ver: http://www.evolt.org/article/Regular_Expressions_in_JavaScript/ 17/36435 / para más detalles.
¿Ya has probado esto?
<script>
var text = '<h2>{title}</h2>\n<p><a href="{url}">{content}</a></p>';
var regex = /\{[a-z]+\}/ig;
var result = text.match(regex);
for (var i = 0; i < result.length; i++) {
console.debug(i + ". " + result[i]);
}
/*
gives:
0. {title}
1. {test}
2. {url}
3. {content}
*/
</script>
Por mucho que me guste rodar mi propio RegExp (y realmente solo necesitas la bandera global), ¿has mirado a plantillas de prototipos , Trimpath JST o algo así ?
Porque posiblemente rodar el suyo no será tan eficiente para la reutilización como los ejemplos anteriores. EG:
String.prototype.template = function (obj) {
return this.replace(/{([^{}]+)}/g,
function (full, word) {
return((typeof obj[word]==='string'||typeof obj[word]==='number')?obj[word]:full);
}
);
};
"The {adj1} {adj2} {noun}.".template({adj1: 'lazy',adj2: 'brown', noun: 'dog'})
==> "The lazy brown dog."
Esto ejecuta su expresión regular cada vez, aunque creo que las plantillas prototipo básicamente lo hacen una vez.
Me salí del camino usando exec
para probar.