Jump to content


Photo

Regex Para Alterar Links Com Preg_Replace


  • Faça o login para participar
7 replies to this topic

#1 Pj Pedrosa

Pj Pedrosa

    Novato no fórum

  • Usuários
  • 4 posts
  • Sexo:Masculino

Posted 10/02/2010, 23:55

Olá, pessoal!

Esta é minha primeira mensagem neste fórum.

Estou com o seguinte problema: criei um script que lê uma página externa (via file_get_contents). Minha ideia é inserir o conteúdo dessa página num banco de dados, mas nesse conteúdo existem algumas tags <img> e <a> com referências para arquivos locais. Então, preciso modificar o endereço dessas imagens e links para que elas apontem para o site original. Por exemplo:

Ao ler a página externa, tenho as seguintes tags:

<a href="arquivo-local.php">Link</a>
<img src="imagens/local.png" alt="Imagem" />

E, antes de inserir no banco de dados, preciso alterar para:

<a href="http://www.foo.com.br/arquivo-local.php" target="_blank">Link</a>
<img src="http://www.foo.com.br/imagens/local.png" alt="Imagem" />

Resumindo: preciso encontrar apenas os <a> e <img> com referências locais (existem alguns com referências externas tb) e inserir o endereço do site original neles.

Sei que preciso usar uma regex para fazer a substituição com preg_replace, mas não estou conseguindo acertar na regex :(

Alguém poderia ajudar?

#2 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 11/02/2010, 01:10

Adicionar uma tag base no cabeçalho da página resolve o problema:

<base href="http://www.foo.com.br/" />
Você pode usar a biblioteca DOM para adicionar a tag dentro do cabeçalho:

<?php

$opts = array(
    'http' => array(
        'user_agent' => 'PHP libxml agent',
    )
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);
libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->loadHTMLFile('http://forum.wmonline.com.br/');
$base = $dom->createElement('base');
$base->setAttribute('href', 'http://forum.wmonline.com.br/');
$head = $dom->getElementsByTagName('head');
$head->item(0)->appendChild($base);

print $dom->saveHTML();

?>
[]’sAté mais

#3 Pj Pedrosa

Pj Pedrosa

    Novato no fórum

  • Usuários
  • 4 posts
  • Sexo:Masculino

Posted 11/02/2010, 09:48

Adicionar uma tag base no cabeçalho da página resolve o problema:

<base href="http://www.foo.com.br/" />
Você pode usar a biblioteca DOM para adicionar a tag dentro do cabeçalho:


Paulo, obrigado pela sua resposta!

Infelizmente adicionar um base na head não me ajuda... Eu já havia tentado fazer isso, mas após o conteúdo retirado do site externo, existem links locais para meu site. Daí, o base alteraria esses links tb... :/

#4 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 11/02/2010, 10:42

Infelizmente adicionar um base na head não me ajuda... Eu já havia tentado fazer isso, mas após o conteúdo retirado do site externo, existem links locais para meu site. Daí, o base alteraria esses links tb... :/

Se os links para o teu site são absolutos não há problema algum, a tag base só afeta os relativos. Se são relativos, nenhuma solução irá funcionar, ao menos da forma de que se está propondo.

[]’sAté mais

#5 Pj Pedrosa

Pj Pedrosa

    Novato no fórum

  • Usuários
  • 4 posts
  • Sexo:Masculino

Posted 11/02/2010, 13:46

Consegui via regex mesmo :)

$html = preg_replace('/<(a|img)(.*)(href|src)=("|\')?(?!http:\/\/)(\/)?(.*)>/','<$1$2$3=$4http://www.foo.com.br/$6>',$html);

Obrigado pela ajuda!

#6 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 11/02/2010, 13:54

Expressão regular para esta finalidade é algo completamente falho, ainda mais ainda com esta ER que apresenta alto grau de imprecisão - isso é algo para qual as expressões regulares não foram feitas, por mais que alguns digam o contrário.
Ainda não entendi o porquê desse código funcionar e a tag base não - não faz o menor sentido. Se isso funciona, ela também funciona.

[]’s Até mais

#7 Pj Pedrosa

Pj Pedrosa

    Novato no fórum

  • Usuários
  • 4 posts
  • Sexo:Masculino

Posted 11/02/2010, 18:58

Paulo, vou levar em consideração o que você disse. Fazendo testes com uma grande quantidade de dados notei algumas falhas que, a rigor, não deveriam acontecer.

Vou adotar a solução do "base href" e converter todos os links e imagens do meu site para caminhos absolutos. Obrigado pela ajuda!

#8 juninhoguitarr

juninhoguitarr

    12 Horas

  • Usuários
  • 250 posts
  • Sexo:Masculino
  • Localidade:campo grande - ms
  • Interesses:php/mysql/apache

Posted 03/04/2013, 14:10

Amigo você pode disponibilizar o script pra gente, pois estou querendo desenvolver um site de busca mas nem faço idéia de por onde começar...

abraços.
Hospedamos seu site Gratuítamente: Programa de Parceirias.
PHP 5.x / MYSQL 5.x / Python, Perl
Superhospedagens.com




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq