Domanda

Ho un documento all'interno di un documento XHTML:

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

Sto cercando di selezionare tutto tra i due tag di script. L ' id sarà sempre JSBALLOONS se questo aiuta. So come selezionarlo includendo i tag di script, ma non so come selezionare i contenuti escludendo i tag di script. Il risultato dell'espressione regolare dovrebbe essere:

    function() {
        this.init = function() {
            this.wAPI = new widgetAPI('__BALLOONS__');
            this.getRssFeed();
        };
    }
È stato utile?

Soluzione

(Post aggiornato specificamente per una soluzione Javascript.)

In Javascript, il tuo codice potrebbe apparire così:

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

Quella parte tra parentesi ([\ S \ s] *?) viene salvata dal motore regex ed è accessibile a te dopo aver trovato una corrispondenza. In Javascript, puoi usare RegExp. $ 1 per fare riferimento alla parte corrispondente all'interno dei tag dello script. Se hai più di uno di questi gruppi, circondato da () , puoi fare riferimento a loro con RegExp. $ 2 e così via, fino a RegExp . $ 9 .

Javascript non corrisponde ai caratteri di nuova riga per impostazione predefinita, quindi è per questo che dobbiamo usare ([\ S \ s] *?) anziché (. *?) , che può avere più senso. Per essere completi, in altre lingue questo non è necessario se si utilizza il modificatore s ( /.../s ).

(Devo aggiungere che le regex sono in genere molto fragili quando si scartano contenuti da pagine HTML come questa. Potresti stare meglio usando jQuery framework per estrarre i contenuti.)

Altri suggerimenti

Ciò che il signore intende per $ 1 è "il valore del primo gruppo di acquisizione". Quando racchiudi parte dell'espressione regolare tra parentesi, vengono definiti i gruppi di acquisizione. Li conti da sinistra a destra. Ogni parentesi di apertura avvia un nuovo gruppo di acquisizione. Possono essere nidificati.

(Esistono modi per definire le espressioni secondarie senza definire i gruppi di acquisizione. Ho dimenticato la sintassi.)

In Perl, $ 1 è la variabile magica che contiene la stringa corrispondente al primo gruppo di acquisizione, $ 2 è la stringa corrispondente al secondo, ecc. Altre lingue potrebbero richiedere di chiamare un metodo sull'oggetto match restituito per ottenere l'ennesimo gruppo di acquisizione.

Ma torniamo alla soluzione di Molf. Supponiamo che abbia detto di usare questo schema invece:

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

In questo caso, se hai più di un elemento di script, questo schema errato li divorerà perché è avido, un punto che vale la pena spiegare. Questo modello inizierà con il primo tag di apertura, corrisponderà al suo tag di chiusura, continuerà e infine corrisponderà all'ultimo. La magia nella soluzione di Molf è il punto interrogativo in (. *?) Che la rende non avida. Restituirà la stringa più corta che corrisponde al modello, quindi non inghiottire elementi di script aggiuntivi.

Non tentare di usare espressioni regolari per lingue non regolari. Il modo giusto è usare un parser XML, resp. il DOM:

document.getElementById("JSBALLOONS")

modifica: Per quanto riguarda il tuo commento, non ho esperienza con JavaScript o jQuery, ma dopo alcune ricerche, penso che qualcosa del genere dovrebbe funzionare:

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

Qualcuno più qualificato può correggere questo?

Lascia foo come stringa contenente il codice. Quindi, puoi rimuovere i tag che racchiudono via

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top