Question

J'ai les éléments suivants dans un document XHTML:

<script type="text/javascript" id="JSBALLOONS">
    function() {
        this.init = function() {
            this.wAPI = new widgetAPI('__BALLOONS__');
            this.getRssFeed();
        };
    }
</script>

J'essaie de tout sélectionner entre les deux balises de script. Le id sera toujours JSBALLOONS si cela vous aide. Je sais comment sélectionner cela, y compris les balises de script, mais je ne sais pas comment sélectionner le contenu à l'exclusion des balises de script. Le résultat de l'expression régulière doit être:

    function() {
        this.init = function() {
            this.wAPI = new widgetAPI('__BALLOONS__');
            this.getRssFeed();
        };
    }
Était-ce utile?

La solution

(Article mis à jour spécialement pour une solution Javascript.)

En Javascript, votre code pourrait ressembler à ceci:

if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) {
    inner_script = RegExp.$1;
}

La partie entre parenthèses ([\ S \ s] *?) est enregistrée par le moteur des expressions rationnelles et est accessible après la recherche d'une correspondance. En Javascript, vous pouvez utiliser RegExp. $ 1 pour faire référence à la partie correspondante dans les balises de script. Si vous avez plusieurs de ces groupes, entourés de () , vous pouvez y faire référence avec RegExp. $ 2 , et ainsi de suite jusqu'à RegExp. . 9 $ .

Javascript ne correspondra pas aux caractères de nouvelle ligne par défaut, c’est pourquoi nous devons utiliser ([\ S \ s] *?) plutôt que (. *?) , ce qui peut avoir plus de sens. Pour compléter, dans d’autres langues, cela n’est pas nécessaire si vous utilisez le modificateur s ( /.../ s ).

(Je dois ajouter que les expressions rationnelles sont généralement très fragiles lorsque vous extrayez du contenu dans des pages HTML, par exemple. Il est peut-être préférable d'utiliser le jQuery pour extraire le contenu.)

Autres conseils

Ce que monsieur veut dire par 1 $ est "la valeur du premier groupe de capture". Lorsque vous mettez une partie de votre expression régulière entre parenthèses, des groupes de capture sont définis. Vous les comptez de gauche à droite. Chaque parenthèse ouvrante commence un nouveau groupe de capture. Ils peuvent être imbriqués.

(Il existe des moyens de définir des sous-expressions sans définir de groupes de capture - j'oublie la syntaxe.)

En Perl, $ 1 est la variable magique contenant la chaîne correspondant au premier groupe de capture, $ 2 correspond à la chaîne correspondant au second, etc. D'autres langues peuvent vous obliger à appeler une méthode sur l'objet correspondant retourné pour obtenir le Nième. groupe de capture.

Mais revenons à la solution de Molf. Supposons qu’il a dit d’utiliser ce modèle à la place:

/<script[^>]+id="JSBALLOONS">(.*)<\/script>/

Dans ce cas, si vous avez plusieurs éléments de script, ce modèle incorrect les engloutira tous parce qu’il est gourmand, ce qui mérite d’être expliqué. Ce modèle commence par la première balise d'ouverture, correspond à la balise de fermeture, continue et enfin correspond à la dernière. La magie dans la solution de molf est le point d'interrogation dans (. *?) Qui la rend non-gourmande. Il renverra la chaîne la plus courte qui correspond au modèle, évitant ainsi de gober des éléments de script supplémentaires.

N'essayez pas d'utiliser des expressions régulières pour des langages non normaux. La bonne façon consiste à utiliser un analyseur XML, resp. le DOM:

document.getElementById("JSBALLOONS")

edit: En ce qui concerne votre commentaire, je n'ai aucune expérience de JavaScript ou de jQuery, mais après quelques recherches, je pense que quelque chose dans ce sens devrait fonctionner:

$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success: function(xml) {
    return $(xml).find("#JSBALLOONS").text();
  }
});

Quelqu'un de plus qualifié peut-il corriger cela?

Soit toto la chaîne contenant le code. Ensuite, vous pouvez dépouiller les balises englobantes via

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top