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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top