Ir para conteúdo

POWERED BY:

Arquivado

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

Link Afiliados Menchini

[Resolvido] Como tirar somente a url de dentro de uma tag "hr

Recommended Posts

Expressão regular:

<?php
$teste = '<a target="_blank" href="http://www.teste.com.br/"> titulo </a>'; 

preg_match_all('#href="(.*?)"#s', $teste, $retorno);

print_r($retorno);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fail.

 

Troquei meu codigo de teste pelo seu e apareceu isso:

 

Array ( [0] => Array ( [0] => href="http://www.teste.com.br/" ) [1] => Array ( [0] => http://www.teste.com.br/ ) ) 

 

Lembrando que estou usando php.

Alguma outra ideia?

A idéia que eu posso lhe passar é: PESQUISE.

 

O que você quer não é o que está no href? O que retornou? Você entende que o preg_match vai retornar um array com o que foi achado? Se quiser apenas a string você deve usar:

echo $retorno['1']['0'];

Compartilhar este post


Link para o post
Compartilhar em outros sites

A idéia que eu posso lhe passar é: PESQUISE.

 

O que você quer não é o que está no href? O que retornou? Você entende que o preg_match vai retornar um array com o que foi achado? Se quiser apenas a string você deve usar:

echo $retorno['1']['0'];

 

Resolvido!

 

Mesmo assim, vou dar uma pesquisada pra saber como funciona essa função pq não conheço ela.

Muuuuuuuuuuito obrigado pela ajuda cara!!!!! qqr conta comigo tbm :)

 

Ocorreu um erro :(

 

Meu código é assim

 

while($linha = mysql_fetch_array($sql_visualizar)) {
$pega_codigo = $linha['codigo'];

preg_match_all('#href="(.*?)"#s', $pega_codigo, $retorno);
$retorno['1']['0'] = $url;

echo $url;

 

Mas ele não está ecoando nada... se puder dar essa ultima ajudinha ::)

Compartilhar este post


Link para o post
Compartilhar em outros sites

veja você está fazendo errado... veja...

$retorno['1']['0'] = $url;

troque por...

$url = $retorno['1']['0'];

 

 

Corrigido, mas pelo jeito não é esse o problema.

Continua não exibindo a URL.

 

OBS: dentro da var pega_codigo tem:

 

<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>

 

codigo:

while($linha = mysql_fetch_array($sql_visualizar)) {
$pega_codigo = $linha['codigo'];

preg_match_all('#href="(.*?)"#s', $pega_codigo, $retorno);
$url = $retorno['1']['0'];

echo $url;

Eu n vejo um erro nisso... tá complexo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Código com algumas alterações, já testado:

<?php
$pega_codigo = '<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>';
preg_match_all('/href\s?=\s?(["\'])([^\1]*)\1/i', $pega_codigo, $retorno);
echo $url = $retorno[ 2 ][ 0 ];// Retorno: http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/

 

EDIT:

Depois de postar, notei que não há necessidade de usarmos preg_match_all, e ainda podemos passar o índice do array como referência, usando menos memória da máquina, ficando assim:

 

<?php
$pega_codigo = '<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>';
preg_match( '/href\s?=\s?(["\'])([^\1]*)\1/i' , $pega_codigo , $retorno);
echo $url =& $retorno[ 2 ];

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

teria como usar suas abilidades com expressão e concertar isso pra mim?

 

Tá na mão:

<?php
$pega_codigo = '<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>';
preg_match( '/href\s?=\s?(["\'])([^\1=]+=([^\1]+))\1/i' , $pega_codigo , $retorno);
echo $url =& $retorno[ 3 ]; //retorno: http://thehorrorshow1.blogspot.com/

 

Mas recomendo que não fique dependente de ajuda externa para solucionar esse tipo de problema.

Leia :seta: http://aurelio.net/regex/guia/

 

EDIT: Uma correção, pensando no futuro:

 

<?php
$padrao = '/href\s?=\s?(["\'])([^\1]+[?&]url=([^\1]+))\1/i';
$teste1 = '<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>';
$teste2 = '<a target="_blank" href="http://blogsdox.com/barra/go.php?um_parametro=hsdfskjhs&url=http://thehorrorshow1.blogspot.com/">The Horror</a>';

preg_match( $padrao , $teste1 , $retorno1 );
preg_match( $padrao , $teste2 , $retorno2 );

echo $url =& $retorno1[ 3 ];
echo '<br />';
echo $url =& $retorno2[ 3 ];

/**
* Retorno:
* http://thehorrorshow1.blogspot.com/
* http://thehorrorshow1.blogspot.com/
*/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode fazer isso sem usar expressão regular!

 

Use a classe DOMDocument

<?php

$html = '<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>';

$DOMDocument = new DOMDocument( );
$DOMDocument->loadHTML( $html );

parse_str( parse_url( $DOMDocument->getElementsByTagName( 'a' )->item( 0 )->getAttribute( 'href' ), PHP_URL_QUERY ) );

echo $url; // http://thehorrorshow1.blogspot.com/

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Excelente observação, Carlos. Principalmente por essa solução apresentar uma mais fácil manutenção.

Porém, se analisarmos a performance entre ambas, eu ficaria com as expressões regulares, CASO este código venha a ser executado em algum looping, o que é o caso.

 

Código:

 

<?php
/**
* Timer Class - Simple benchmark solution for PHP
* @author Matheus Tavares <contato at matheustavares . com . br>
* @license Creative Commons BY-NC
*/
final class Timer {

       private $_start, $_difference = 0;

       /**
        * Starts a benchmark
        * @return string
        */
       public function benchmark() {
               if ( ( $num_args = func_num_args() ) < 1 ) :
                       trigger_error(
                               'You must set at least one function as argument'
                       );
                       return false;
               endif;

               $timer_index = 0;
               $output = '';
               foreach( func_get_args() as $function ):
                       $this->start();
                       $function();
                       $this->stop();

                       $timer[ ++$timer_index ] = $this->get();
                       $output .= sprintf(
                               'Timer <b>#%d:</b> %.7f<br />',
                               $timer_index , $this->get()
                       );
                       $this->reset();
               endforeach;

               if ( $num_args > 1 ) :
                       asort( $timer , SORT_NUMERIC );
                       $keys = array_keys( $timer );

                       $min = array_shift( $timer );
                       $max = end( $timer );
                       $percent = self::percentDiff( $min , $max );

                       $output .= sprintf(
                               'The timer <b>#%d</b> (fastest) is <b>%.2f%%</b> 
                               faster than timer <b>#%d</b> (slowest)',
                               array_shift( $keys ) , $percent , end( $keys )
                       );
               endif;
               return $output;
       }

       /**
        * Starts the counter
        * @return void
        */
       public function start() {
               $this->_start = self::getMicrotime();
       }

       /**
        * Stops the counter
        * @return void
        */
       public function stop() {
               $difference = self::getMicrotime() - $this->_start;
               $this->_difference += $difference;
       }

       /**
        * Gets the counter
        * @return float
        */
       public function get() {
               return $this->_difference;
       }

       /**
        * Resets the counter
        * @return void 
        */
       public function reset() {
               $this->_difference = 0;
       }

       /**
        * Improved variant of microtime() function
        * @param int $e
        * @return float 
        */
       public static function getMicrotime( $e = 7 ) {
               list( $usec , $sec ) = explode( ' ', microtime() );
               return bcadd( $usec , $sec , $e );
       }

       /**
        * Gets the difference between 2 numbers, in percent
        * @param float $min
        * @param float $max
        * @return float The percent
        */
       public static function percentDiff( $min , $max ) {
               return ( ( $max - $min ) / $min ) * 100;
       }

}

$timer = new Timer();
echo $timer->benchmark(
       function() {
		$var = 0;
		for ( $i = 0 ; $i < 30000 ; $i++ ) :
			$html = '<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>';
			$DOMDocument = new DOMDocument( );
			$DOMDocument->loadHTML( $html );
			parse_str( parse_url( $DOMDocument->getElementsByTagName( 'a' )->item( 0 )->getAttribute( 'href' ), PHP_URL_QUERY ) );
		endfor;
       },
       function() {
		$var = 0;
		for( $i = 0 ; $i < 30000 ; $i++ ) :
			$pega_codigo = '<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://thehorrorshow1.blogspot.com/">The Horror</a>';
			preg_match( '/href\s?=\s?(["\'])([^\1]+[?&]url=([^\1]+))\1/i' , $pega_codigo , $retorno);
			$url =& $retorno[ 3 ];
		endfor;
       }
);

 

 

Resultado aproximado:

Timer #1: 0.8948691

Timer #2: 0.1679220

The timer #2 (fastest) is 432.91% faster than timer #1 (slowest)

 

Podemos estimar uma diferença de aproximadamente 400% em performance entre ambas as soluções, e apesar de eu não ter analisado o uso de memória, também creio que seja muito maior usando DOMDocument.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preciso de uma ultima ajuda de vocês com expressões....

Tenho uma parte do codigo assim:

 

preg_match( '/href\s?=\s?(["\'])([^\1=]+=([^\1]+))\1/i' , $pega_codigo , $retorno);
$url = $retorno[ 3 ];

 

Ele transforma

<a target="_blank" href="http://blogsdox.com/barra/go.php?url=http://www.thehorrorshow.com/">The Horror</a>

 

EM

 

http://www.thehorrorshow.com/

 

só que preciso que ele transforme em

http://thehorrorshow.com/

(sem o www)

O código é esse:

 

preg_match( '/href\s?=\s?(["\'])([^\1=]+=([^\1]+))\1/i' , $pega_codigo , $retorno);
$url = $retorno[ 3 ];

 

Quem dar essa ultima ajudinha :)

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.