← PHP

Problema com preg_replace em PHP

Lida 10135 vezes

Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Já mudei
Offline

Liurai 
Membro
Mensagens 16 Gostos 0
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 10 Posts First Post

Muito obrigado
Já vou experimentar, mas já agora tenho duas perguntas.
A variável $match neste caso específico está a funcionar como variável dummy?
Para que serve a arroba antes do mysql_num_rows?
Obrigado

<?
        $html
='<html>
        <body>
                algum texto
                <a href="thumbnails.php?album=34">Portugal</a>
                outro texto e fotos e outros elementos
                <a href="thumbnails.php?album=21">Brasil</a>
                jgfhjh kjdf gkjh dfkjhg dfhg kfhgkjh e mais fotos
                <a href="thumbnails.php?album=87">Mongolia</a>
        </body>
</html>'
;
        while(
preg_match_all("/thumbnails\.php\?album=(\d+)/i",$html,$match)) {
                
$texto "";
                
$sql "SELECT campo FROM tabela WHERE id='$match[1][0]'";               
                
$result mysql_query($sql);
                if(@
mysql_num_rows($result)) {
                        
$query mysql_fetch_array($result);
                        
$texto $query['campo'];
                }
                if(empty(
$texto)) $texto "Indefinido";
                
$replace 'miniaturas-'.$texto.'-$1';
                
$html preg_replace('/thumbnails\.php\?album=(\d+)/i'$replace$html); 
        echo 
$html;
?>


Offline

Liurai 
Membro
Mensagens 16 Gostos 0
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 10 Posts First Post

Esquece a pergunta do $match. Não a tinha visto na query sql. :-#
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

o @ é para não dar erro, se falhar, não faz e nunca devolve nada para output. Dependendo da configuração do output poderá mostrar mais erros, notices, etc, se colocares isso, nunca vai aparecer em nenhum servidor.

Depois diz se funciona ou não
Offline

Liurai 
Membro
Mensagens 16 Gostos 0
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 10 Posts First Post

Tem apenas de se fazer uma pequena alteração. O php tem alguns problemas com arrays dentro de uma string e neste caso não estava a conseguir fazer a substituição do match[1][0] pelo seu conteúdo: em vez do id colocava "Array[0]"
Por isso é só preciso alterar para isto:
      $aid = $match[1][0];
      $sql = "SELECT campo FROM tabela WHERE aid='$aid'";
Ou então por isto
      $sql = "SELECT campo FROM tabela WHERE aid='".$match[1][0]."'";

De resto funciona na perfeição.
Muito obrigado a ti e ao skin por toda a ajuda e atenção. Deu para resolver o meu problema e para aprender mais um pouco.
 :obrigado:
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Não tinha testado, e até faltava mais, faltava fechar o ciclo while. Corrigi no outro post.
Offline

Liurai 
Membro
Mensagens 16 Gostos 0
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 10 Posts First Post

Ainda tem um pequeno problema

Se houver mais de uma substring a ser "remodelada" e o valor do id for diferente, a 2ª nova substring apesar de aparecer com o id certo, aparece com o conteúdo do "campo" da 1ª substring.

Ou seja, isto:

  $html='<html>
        <body>
                algum texto
                <a href="thumbnails.php?album=34">Portugal</a>
                outro texto e fotos e outros elementos
                <a href="thumbnails.php?album=21">Brasil</a>
                jgfhjh kjdf gkjh dfkjhg dfhg kfhgkjh e mais fotos
                <a href="thumbnails.php?album=87">Mongolia</a>
        </body>
</html>';

vai resultar nisto:

  $html='<html>
        <body>
                algum texto
                <a href="miniaturas-Portugal-34">Portugal</a>
                outro texto e fotos e outros elementos
                <a href="miniaturas-Portugal-21">Brasil</a>
                jgfhjh kjdf gkjh dfkjhg dfhg kfhgkjh e mais fotos
                <a href="miniaturas-Portugal-87">Mongolia</a>
        </body>
</html>';
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Vai aparecer como está na base de dados, tinhas fechado bem o while? é que eu só corrigi o while e o array depois.
Offline

Liurai 
Membro
Mensagens 16 Gostos 0
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 10 Posts First Post

Não, eu já tinha fechado esse while.

Mas julgo que descobri o problema
Nesta linha, tinhas isto assim:

$html = preg_replace('/thumbnails\.php\?album=(\d+)/i', $replace, $html);

O problema é que a primeira vez que esta linha era executada, fazia o replace de todas as "ocorrencias", independentemente de ter o id "certo" ou não. Aliás, o loop assim só seria executado uma vez, já que o preg_match_all não encontraria mais nenhuma correspondencia. Ou seja, só vamos querer que o preg_replace seja executado uma vez. Por isso, temos de acrescentar mais o parâmetro ao preg_replace indicando que o número de replaces é só 1.

$html = preg_replace('/thumbnails\.php\?album=(\d+)/i', $replace, $html,1);