Pergunta

Eu tenho o seguinte dentro de um documento XHTML:

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

Eu estou tentando selecionar tudo entre as duas marcas de script. O id será sempre JSBALLOONS se isso ajuda. Eu sei como selecionar que incluindo as tags de script, mas eu não sei como selecionar o conteúdo, excluindo as marcas de script. O resultado da expressão regular deve ser:

    function() {
        this.init = function() {
            this.wAPI = new widgetAPI('__BALLOONS__');
            this.getRssFeed();
        };
    }
Foi útil?

Solução

(pós Atualizado especificamente para uma solução Javascript.)

Em Javascript, seu código pode ter esta aparência:

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

Essa parte entre parênteses ([\S\s]*?) é salvo pelo motor regex e é acessível a você depois de uma correspondência for encontrada. Em Javascript, você pode usar RegExp.$1 de referência para a parte correspondida dentro das tags de script. Se você tem mais de um tal grupo, cercado por (), você pode se referir a eles com RegExp.$2, e assim por diante, até RegExp.$9.

Javascript não irá corresponder caracteres de nova linha por padrão, de modo que é por isso que nós temos que ([\S\s]*?) uso ao invés de (.*?), o que pode fazer mais sentido. Apenas para ser concluída, em outros idiomas isso não é necessário se você usar o modificador s (/.../s).

(Tenho de acrescentar que as expressões regulares são tipicamente muito frágil quando raspagem conteúdo de páginas HTML como este. Você pode ser melhor fora de usar o framework jQuery para extrair o conteúdo.)

Outras dicas

O que os meios cavalheiro por $ 1 é "o valor do primeiro grupo de captura". Quando você colocar parte de sua expressão regular entre parênteses, que define grupos de captura. Você contá-los a partir da esquerda para a direita. Cada parêntese de abertura começa um novo grupo de captura. Eles podem ser aninhados.

(Há maneiras de definir sub expressões sem definir grupos de captura -. I esquecer a sintaxe)

Em Perl, US $ 1 é a variável mágica segurando a corda acompanhado pelo primeiro grupo de captura, $ 2 é a sequência compensada pela segunda, etc. Outros idiomas podem exigir que você chamar um método no objeto jogo voltou a obter o Nth captura de grupo.

Mas de volta à solução da molf. Suponha que ele disse para usar este padrão em vez disso:

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

Neste caso, se você tiver mais de um elemento de script, esse padrão incorreta irá devorá-los todos porque é ganancioso, um valor de ponto de explicação. Esse padrão vai começar com a primeira marca de abertura, corresponder à sua marca de fechamento, continue indo, e, finalmente, combinar com o passado. A magia em solução de molf é o ponto de interrogação no (. *?) Que o torna não-ganancioso. Ele irá retornar o mais curto string que corresponde ao padrão, portanto, não devorar elementos de script extras.

Não tente usar expressões regulares para idiomas não-regulares. O caminho certo é usar um parser XML, resp. DOM:

document.getElementById("JSBALLOONS")

edit: Quanto o seu comentário, eu não tenho nenhuma experiência com JavaScript ou jQuery, mas depois de alguma pesquisa, eu acho que algo nesse sentido deve funcionar:

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

Pode alguém mais qualificado correto isso?

Let foo ser a string contendo o código. Então, você pode tirar as etiquetas que encerram via

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top