2009-06-23 5 views
0

Je donne les résultats suivants dans un document XHTML:Quelle expression régulière correspondrait à ces données?

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

Je suis en train de sélectionner tout entre les deux balises de script. Le id sera toujours JSBALLOONS si cela aide. Je sais comment sélectionner cela, y compris les balises de script, mais je ne sais pas comment sélectionner le contenu en excluant les 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(); 
     }; 
    } 
+1

Bonjour, mes remerciements a été supprimé par un modérateur!?! Pour info, la fin de ce post utilisé pour inclure: Merci, Pete. Je n'aime pas les modérateurs qui pillent mes messages, surtout en enlevant ma courtoisie. – slypete

Répondre

8

(après mise à jour spécifiquement pour une solution Javascript.)

En Javascript, votre code pourrait ressembler à ceci:

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

Ce la partie entre parenthèses ([\S\s]*?) est sauvegardée par le moteur de regex et vous est accessible après avoir trouvé une correspondance. En Javascript, vous pouvez utiliser RegExp.$1 pour faire référence à la partie correspondante dans les balises de script. Si vous en avez plusieurs, entourés de (), vous pouvez vous y référer 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 sembler plus logique. Juste pour être complet, dans d'autres langues, ce 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 le contenu de grattage de pages HTML comme celui-ci. Vous pouvez être mieux d'utiliser le cadre jQuery pour extraire le contenu.)

+0

Salut, merci. C'est exactement ce que j'ai, mais cela inclut les balises de script. Pouvez-vous expliquer ce que vous voulez dire par 1 $? Je ne suis pas familier. Merci! – slypete

+0

@slypete, quel langage ou outil utilisez-vous pour exécuter l'expression rationnelle? – molf

+0

@molf, j'utilise javascript et jQuery. var javascript = this.données.match (/ ] + id = "JSBALLOONS"> ([\ S \ s] *?) <\/script>/ig); this.javascript = eval ('(' + javascript + ')'); – slypete

2

Ce que le 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, elle définit les groupes de capture. Vous les comptez de la gauche vers la droite. Chaque parenthèse ouvrante démarre un nouveau groupe de capture. Ils peuvent être imbriqués.

(Il y a plusieurs façons de définir les expressions sous sans définir des groupes de capture -. J'oublie la syntaxe)

En Perl, $ 1 est la variable magique qui contient la chaîne adaptée par le premier groupe de capture, 2 $ est la chaîne assortie par la seconde, etc. D'autres langues peuvent vous obliger à appeler une méthode sur l'objet de correspondance renvoyé pour obtenir le Nième groupe de capture.

Mais revenons à la solution de molf. Supposons qu'il dit utiliser ce modèle à la place:

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

Dans ce cas, si vous avez plus d'un élément de script, ce modèle incorrect les gober tout, car il est gourmand, un point qui mérite d'expliquer. Ce modèle commence avec la première balise d'ouverture, correspond à sa balise de fermeture, continue, et enfin correspond à la dernière. La magie dans la solution de molf est le point d'interrogation dans (. *?) Qui le rend non-gourmand. Il retournera la chaîne la plus courte qui correspond au modèle, donc pas engloutir des éléments de script supplémentaires. N'essayez pas d'utiliser des expressions régulières pour des langages non-réguliers.

+0

Merci, très utile aussi! – slypete

2

La bonne façon est d'utiliser un analyseur XML, resp.DOM:

document.getElementById("JSBALLOONS") 

modifier: En ce qui concerne votre commentaire, je n'ai aucune expérience avec JavaScript ou jQuery, mais après quelques recherches, je pense que quelque chose le long de ces lignes devrait fonctionner:

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

Can Quelqu'un de plus qualifié corriger cela?

+0

Ce contenu n'est pas sur le DOM, donc j'ai peur que cela ne fonctionne pas. – slypete

+0

Le document est chargé à distance dans une chaîne dont j'ai besoin d'extraire certaines choses. Je suis conscient que regex n'est pas la meilleure solution. S'il vous plaît faites-moi savoir si vous connaissez d'autres solutions de travail. Merci! – slypete

+0

Encore une fois, cela ne fonctionnera pas. J'ai essayé ça. S'il vous plaît voir mon autre question plus générale pour la raison: http://stackoverflow.com/questions/1034881/what-is-the-best-practice-for-parsing-remote-content-with-jquery Espérons que quelqu'un sera capable de trouver une réponse à cette question. – slypete

0

Soit foo la chaîne contenant le code. Ensuite, vous pouvez enlever les balises enserrant par

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))