Question

En javascript, j'ai un bloc HTML comme celui-ci:

<h2>{title}</h2>
<p><a href="{url}">{content}</a></p>

Et j'essaie d'utiliser regex " match " cracher un tableau de tous les {item}. Donc, ma sortie devrait ressembler à:

['title', 'url', 'content']

Je suis aussi loin que:

var pattern = new RegExp("\{[a-zA-Z]+\}+");
var match = pattern.exec("{Sample} bob {text}");

Mais il ne retourne que la première balise.

Ceci est juste au-delà de mes compétences regex. Quelqu'un peut-il aider?

Salut!

Était-ce utile?

La solution

Vous devez créer un motif avec l'indicateur global:

var pattern = new RegExp("\{[a-zA-Z]+\}", "g");

ou:

var pattern = /\{[a-zA-Z]+\}/g;

Ensuite, vous pouvez appeler la méthode match () sur votre chaîne pour obtenir une liste de correspondances:

var matches = "{Sample} bob {text}".match(pattern);

Autres conseils

Je pense que vous voulez:

var pattern = new RegExp("\{[a-zA-Z]+\}+", "g");

La deuxième option est un drapeau lui demandant de rechercher toute la chaîne et de renvoyer toutes les correspondances.

Voir: http://www.evolt.org/article/Regular_Expressions_in_JavaScript/ 17/36435 / pour plus de détails.

Avez-vous déjà essayé ceci?

<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>

Même si j'aime bien lancer ma propre RegExp (et que vous avez vraiment besoin du drapeau global), avez-vous consulté modèles de prototype , JST Trimpath , ou quelque chose du genre. ?

Parce que rouler vous-même ne sera peut-être pas aussi efficace que les exemples ci-dessus. 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."

Ceci exécute votre expression rationnelle à chaque fois, alors que les modèles de prototype le font une fois.

J'ai quitté le chemin en utilisant exec pour les tests.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top