Que expressão regular iria coincidir com esses dados?
-
06-07-2019 - |
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();
};
}
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('<'))