14 votes

Comment faire en sorte que regex corresponde à plusieurs balises de script?

Je tente de renvoyer le contenu de tous les balises `` dans un corps de texte. Actuellement, j'utilise l'expression suivante, mais elle ne capture que le contenu de la première balise `<script>` et ignore les suivantes. </p> <p>Voici un exemple du code HTML :</p> <pre><code> <script type="text/javascript"> alert('1');

Test

alert('2');

Mon regex ressemble à ceci :

//scripttext contient l'exemple
re = /]*>([\s\S]*?)<\/script>/gm;
var scripts  = re.exec(scripttext);

Lorsque je lance ceci sur IE6, cela renvoie 2 correspondances. La première contenant la balise `` complète, la deuxième contenant alert('1').</p> <p>Lorsque je le lance sur <a href="http://www.pagecolumn.com/tool/regtest.htm" rel="noreferrer">http://www.pagecolumn.com/tool/regtest.htm</a>, cela me donne 2 résultats, chacun contenant uniquement les balises `<script>`.</p></x-turndown>

47voto

kangax Points 19954

Le "problème" ici réside dans le fonctionnement de exec. Il ne correspond qu'à la première occurrence, mais stocke l'indice actuel (c'est-à-dire la position du curseur) dans la propriété lastIndex d'une expression régulière. Pour obtenir toutes les correspondances, il suffit d'appliquer l'expression régulière à la chaîne jusqu'à ce qu'elle ne corresponde plus (c'est une méthode assez courante pour le faire) :

var scripttext = ' \nalert(\'1\');\n\n\nTest\n\n\nalert(\'2\');\n';

var re = /]*>([\s\S]*?)<\/script>/gm;

var match;
while (match = re.exec(scripttext)) {
  // le correspondant complet se trouve dans match[0], tandis que les groupes capturés se trouvent dans ...[1], ...[2], etc.
  console.log(match[1]);
}

5voto

Svante Points 24355

N'utilisez pas d'expressions régulières pour l'analyse HTML. Le HTML n'est pas un langage régulier. Utilisez la puissance du DOM. C'est beaucoup plus facile, car c'est l'outil adéquat.

var scripts = document.getElementsByTagName('script');

3voto

Justin Johnson Points 16243

Essayez d'utiliser le drapeau global :

document.body.innerHTML.match(/([\s\S]*?)<\/script>/gmi)

Édition : ajout de plusieurs drapeaux pour les lignes multiples et la sensibilité à la casse (pour des raisons évidentes).

1voto

Phoexo Points 701

Le premier groupe contient le contenu des balises.

Éditer: Ne faut-il pas entourer l'énoncé regex de guillemets ? Comme:

re = "/]*>([\s\S]*?)<\/script>/gm";

0voto

unigg Points 279

En .Net, il y a une méthode submatch, en PHP, preg_match_all, qui devrait résoudre votre problème. En Javascript, il n'y a pas de telle méthode. Mais vous pouvez le faire vous-même.

Tester sur http://www.pagecolumn.com/tool/regtest.htm

Sélectionnez la méthode $1elements pour obtenir ce que vous voulez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X