Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alexsandro XPT

Expressões Regulares

Recommended Posts

Opa galera, eu fiz a seguinte ER

 

<script.*?\>(.*?)\<\/script\>

Mas ela retorna todo o bloco:

 

<script>
<!--
window.status = "0,25278401374817";
if(typeof(console)=="object")
	console.info("0,25278401374817");
//-->
</script>

como eu faço pra pegar so o:

 

window.status = "0,25278401374817";
if(typeof(console)=="object")
	console.info("0,25278401374817");

nao quero nem o <!-- e nem o //-->

 

Valew...

Compartilhar este post


Link para o post
Compartilhar em outros sites

não se esqueça da TAG CODE beleza?

 

opa então vamos ver... você está usando PREG??

talvez você tenha escrito errado:

 

veja um exemplo:

 

PHP
<?php

$Text = '<script>

<!--

window.status = "0,25278401374817";

if(typeof(console)=="object")

console.info("0,25278401374817");

//-->

</script>';

$Text = preg_replace("/<script(.*?)>(.*?)</script>/is","$2", $Text);

$Text = str_replace("<!--","",$Text);

$Text = str_replace("//-->","",$Text);

echo $Text;

?>

não usei PREG em <!-- e //--> por que poderia não haver essas TAGs no SCRIPT

assim acabaria não funcionando

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae!! valew pela atençao! :)

 

Deixa eu te explicar, estou fazendo um plugin SMARTY do tipo Posfiltros que vai pegar todos elementos <script> e vai fazer um pack neles, entendeu?

Dai quero subistituir o conteudo da tag por um novo SCRITP JS ;) saco?

 

No seu exemplo ai remove a tag SCRIPT ne?

Eu estou usando preg_replace.

 

Tem mais alguma ideia pra ajudar?

 

Valew... :D

 

 

 

não se esqueça da TAG CODE beleza?

 

opa então vamos ver... você está usando PREG??

talvez você tenha escrito errado:

 

veja um exemplo:

 

PHP
<?php

$Text = "keywordHandler:addKeyword({'sell', 'violet gem'},";

$Text = preg_replace("/(.*?)/is","$2", $Text);

$Text = split_replace("<!--","",$Text);

$Text = split_replace("//-->","",$Text);

echo $Text;

?>

não usei PREG em <!-- e //--> por que poderia não haver essas TAGs no SCRIPT

assim acabaria não funcionando

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpa campeão escrevi o código errado:

 

refeito:

PHP
<?php

$Text = '<script>

<!--

window.status = "0,25278401374817";

if(typeof(console)=="object")

console.info("0,25278401374817");

//-->

</script>';

$Text = preg_replace("/<script(.*?)>(.*?)</script>/is","$2", $Text);

$Text = str_replace("<!--","",$Text);

$Text = str_replace("//-->","",$Text);

echo $Text;

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha so como está ficando:

 

 

PHP
<?php

/**

* Smarty plugin

* -------------------------------------------------------------

* File:     postfilter.packjs.php

* Type:     postfilter

* Name:     packjs

* Purpose:  Convert SCRIIPT tags to be a packed script.

* -------------------------------------------------------------

* @author Alexsandro Souza Pereira

*/

function smarty_postfilter_packjs($source, &$smarty){

        $atributos = preg_replace('/<script(.*?)>(.*?)</script>/is','$1', $source);

        $script = preg_replace('/<script(.*?)>(.*?)</script>/is','$2', $source);

        if($script){

                require_once('class.JavaScriptPacker.php');

                $packer = new JavaScriptPacker($script, 62, false);

                $packed = $packer->pack();

        }

        return "<script$atributos>n//<![CDATA[n$packedn//]]>n</script>";

}

?>

 

Acho que eu poderia melhorar estas ER ai viu.. mas ainda nao sei como..

Alguma dica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ta otimo continue assim, sim só uma dica: use

$Text = str_replace("<!--","",$Text);
$Text = str_replace("//-->","",$Text);
pois as veze é melhor tirar TAGs que podem bloquear o resto da script

 

mas lógico isso depende de qual será sua finalidade

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia testar com preg_match:

 

PHP
$str = '<script type="text/javascript">

<!--

window.status = "0,25278401374817";

if(typeof(console)=="object")

console.info("0,25278401374817");

//-->

</script>';

 

 

$resultado = preg_match('@<script(.*?)>(<!--)?(.*?)(//-->)?(.*?)</script>@is', $str, $reg);

 

if( $resultado == true )

{

        // separamos as variaveis

        list( $expressao_encontrada, $atributos, $vazio1, $vazio2, $vazio3, $codigo ) = $reg;

 

        // fazemos o necessario

}

 

O preg_match permite que você faça uma expressão regular e capture os resultados encontrados e armazene-os dentro de um array (no caso, $reg).

Ele só não captura no exemplo citado os opcionais - (<!--)? e (//-->)? -, nestes casos, o sinal de interrogação após os parenteses indicam que o aparecimento da expressão é opcional.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae, gostei do preg_match mas veja, parece que neste caso ele so acha 1 ocorrencia ne?

Dai zebra tudo ne?

 

PHP
<?php

$str = <<<EOD

<script type="text/javascript">

//<![CDATA[

var ajaxIndicator, ajaxError;

jQuery(document).ready(function(){

        var dfrerereoptions = {beforeSubmit: function(){ alert('teste'); dfrerereValida(); }

                                        ,success: function(){ alert('cabo'); dfrerereShowResponse(); }

                                        ,target: '#abc'

                                        ,url: 'teste.php'

                                        ,dataType:'html'

                                };

        ajaxIndicator = jQuery("#rerereindic");

        ajaxError = jQuery("#rerereerro");

        ajaxIndicator.hide();

        ajaxError.hide();

        jQuery("#dfrerere").ajaxForm(dfrerereoptions);

        ajaxError.ajaxError(function(oHtml, oResponseError,oRequest){

                ajaxError.empty();

                ajaxError.append("<b>" + oResponseError.statusText + " " + oResponseError.status + "</b><br><br>");

                ajaxError.append("Mensagem de erro:" + oResponseError.responseText + "");

                ajaxError.fadeIn("slow");

        });

        ajaxIndicator.ajaxStart(function(){

                ajaxError.hide();

                ajaxIndicator.fadeIn("slow");

        });

        ajaxIndicator.ajaxStop(function(){

                ajaxIndicator.hide();

        });

});

dfrerereShowResponse = function(){

        jQuery("#rerereindic").hide();

}

dfrerereValida = function(){

        ajaxIndicator = jQuery("#rerereindic");

        ajaxError = jQuery("#rerereerro");

        return true;

}

//]]>

</script>

<form id="dfrerere" name="dfrerere" method="post" action="teste.php" >  <div id="rerereindic">carregando...</div><input type="text" size="15" />

        <div id="rerereerro">error</div>

        <div id="abc"></div>

</form>    <!-- DIV QUE CONTEM O TOPO -->

    <div id="topo">

<p></p>

 

<div id="topo_login"><a href="java script:void(0)" id="show-dialog-btn">login</a> <span id="logado"> | <a href="cadastro.php">criar uma conta</a> </span></div>

<script type="text/javascript">

<!--

window.status = "0,25278401374817";

if(typeof(console)=="object")

console.info("0,25278401374817");

//-->

</script>';

EOD;

 

$resultado = preg_match('@<script(.*?)>(<!--)?(.*?)(//-->)?(.*?)</script>@is', $str, $reg);

 

if( $resultado == true )

{

        // separamos as variaveis

        list( $expressao_encontrada, $atributos, $vazio1, $vazio2, $vazio3, $codigo ) = $reg;

 

        // fazemos o necessario

}

?>

 

________________________________________________________________________________

_____________

 

Mas olhe o que eu fiz até agora? o que acha?

PHP
<?php

/**

* Smarty plugin

* -------------------------------------------------------------

* File:     outputfilter.packjs.php

* Type:     outputfilter

* Name:     packjs

* Purpose:  Convert SCRIIPT tags to be a packed script.

* -------------------------------------------------------------

* @package Smarty

* @subpackage Plugins

* @author Alexsandro Souza Pereira <alexsandro at alexsandro.com.br>

* @since Ipatinga/MG 17 de Dezembro 2007 14:35

* @link <a href="http://www.alexsandro.com.br" target="_blank">http://www.alexsandro.com.br</a>

* @see <a href="http://forum.imasters.com.br/index.php?showtopic=263533" target="_blank">http://forum.imasters.com.br/index.php?showtopic=263533</a>

* @version 1.0

*/

require_once('class.JavaScriptPacker.php');

function smarty_outputfilter_packjs($output, &$smarty){

        return preg_replace_callback('/<script(.*?)>(.*?)</script>/is',packer_callback,$output);

}

 

function packer_callback( $matches ){

        if(strlen($matches[2])>0){

                $s = JavaScriptPacker::script($matches[2], 62, false);

                return "<script$matches[1]>n//<![CDATA[n$s//]]>n</script>";

        }else{

                return "<script$matches[1]></script>";

        }

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

para pegar todas as ocorrencias, no caso, você poderia usar a mesma expressão, só que usar ao invés de preg_match, usar preg_match_all.

Mudaria um pouco somente para tratar os resultados, mas funcionaria também.

 

Vou fazer um exemplo e posto depois.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, depois você posta ai pra gente ver.... ;)

 

Valew pela atençao.

 

para pegar todas as ocorrencias, no caso, você poderia usar a mesma expressão, só que usar ao invés de preg_match, usar preg_match_all.

Mudaria um pouco somente para tratar os resultados, mas funcionaria também.

 

Vou fazer um exemplo e posto depois.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$str = 'aqui vai o html com javascript';

$resultado = preg_match_all('@<script(.*?)>(<!--)?(.*?)(//-->)?(.*?)</script>@is', $str, $reg);

if( count($reg[0]) > 0 ) // se houve resultados
{
	// o bom do preg_match_all é que vem tudo separado já
	for($i=0; $i<count($reg[0]); $i++) 
	{
		$codigo = $reg[5][$i];
		
		// agora faz o necessário
	}
}

só desculpe pela demora, é que a semana foi bem corrida.

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só um detalhe que reparei agora.

Você está fazendo um plugin para o Smarty como OUTPUT FILTER.

 

Você irá, então, executá-lo sempre DEPOIS do resultado de um template, correto?

Porque, pensemos juntos: se a cada requisição de cada usuário que entrar no site, ele passar por este filtro, ele perderia um pouco de performance, claro que não seria taaaanta, mas perderia. Já pensou em fazer uma rotina e registrá-la como um pré-filtro?

 

Um pré-filtro é executado antes da primeira geração do template, e somente na primeira. Como, teoricamente, este javascript vai ser escrito no template, sempre que você mudar o template, o Smarty irá atualizar o cache somente uma unica vez, não precisando fazer esta checagem a cada requisição. Ou seja, ele vai mudar somente na primeira vez, porque no restante já estaria correto.

 

Eu faço assim nos sites que uso Smarty (praticamente todos heheh). Como os arquivos de template ficam em uma pasta separada da aplicação (consequentemente, as imagens ficariam erradas), registro um pré-filtro antes da primeira geração, daeh ele grava o cache com os caminhos das imagens corretamente.

 

Dê uma pensada e poste depois o que acha.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae, estou dando olhada no seu script, valew ;)

 

Quanto ao plugin é o seguinte:

 

Eu nao posso usa-lo como pre e nem pos porque tenho plugins pre e pos que geram JS randomicamente, entao tiver q usar este como output, so que como as paginas vao ficar em smarty cache, acho entao que nao irá executar toda vez, estou certo ou errado?

 

Enquanto elas estiverem fora de cache elas estao gastando 100 ms a mais com este plugin.. mas acreio que quando ativar o cache tudo vai melhorar :P

 

Bye... valewwww

 

Só um detalhe que reparei agora.

Você está fazendo um plugin para o Smarty como OUTPUT FILTER.

 

Você irá, então, executá-lo sempre DEPOIS do resultado de um template, correto?

Porque, pensemos juntos: se a cada requisição de cada usuário que entrar no site, ele passar por este filtro, ele perderia um pouco de performance, claro que não seria taaaanta, mas perderia. Já pensou em fazer uma rotina e registrá-la como um pré-filtro?

 

Um pré-filtro é executado antes da primeira geração do template, e somente na primeira. Como, teoricamente, este javascript vai ser escrito no template, sempre que você mudar o template, o Smarty irá atualizar o cache somente uma unica vez, não precisando fazer esta checagem a cada requisição. Ou seja, ele vai mudar somente na primeira vez, porque no restante já estaria correto.

 

Eu faço assim nos sites que uso Smarty (praticamente todos heheh). Como os arquivos de template ficam em uma pasta separada da aplicação (consequentemente, as imagens ficariam erradas), registro um pré-filtro antes da primeira geração, daeh ele grava o cache com os caminhos das imagens corretamente.

 

Dê uma pensada e poste depois o que acha.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.