Ir para conteúdo

Arquivado

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

Maykel-ctba

Encontrar tag <img> em string e manipulá-la (Regex?)

Recommended Posts

Fala povo,

 

Tenho também outra dúvida. Tenho uma string contendo uma notícia, e a mesma já vem com todo o código HTML (parágrafos, blockquotes, etc.)

 

Gostaria de localizar todas as tags <img> desta string, e através de expressoes regulares remover o atributo "style='blablabla'" e mudar o atributo src, adicionando no inicio do value desse atributo a string "/common/lib/thumb.php?url="

 

É possível? Se sim, como posso fazer?

 

--

 

Até consigo detectar se o post tem uma imagem na string, mas não sei como fazer alterá-la :/

 

$postFinal = $objBlog->Conteudo();
$padrao = "/<img"."[^>]*>/";
							
if (preg_match($padrao,$postFinal))
{
	alert("Tem imagem");
}
else
{
	alert("Não tem imagem");	
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Ademilson hahaha, eu já estou quebrando a cabeça um pouquinho, até entendi alguma coisa das regras de expressão, mas agora a parte de manipular isso é onde não estou sabendo fazer.

 

 

String de exemplo ($postFinal):

<p>Aliquam vehicula faucibus tellus. Praesent condimentum commodo libero, sit amet pellentesque metus bibendum sit amet. Donec commodo tortor in libero consequat suscipit. Maecenas eget augue vulputate neque pulvinar lobortis. Fusce posuere lorem scelerisque, facilisis velit eu, vehicula nulla. Mauris vestibulum vulputate justo, et tincidunt neque imperdiet eget.</p>
<img alt="" src="/upload/ckeditor/CARTOAEROMED2.jpg" style="width: 800px; height: 648px;" />

 

 

Como gostaria que retornasse:

<p>Aliquam vehicula faucibus tellus. Praesent condimentum commodo libero, sit amet pellentesque metus bibendum sit amet. Donec commodo tortor in libero consequat suscipit. Maecenas eget augue vulputate neque pulvinar lobortis. Fusce posuere lorem scelerisque, facilisis velit eu, vehicula nulla. Mauris vestibulum vulputate justo, et tincidunt neque imperdiet eget.</p>
<img alt="" src="/common/function/thumb.php?url=../../upload/ckeditor/CARTOAEROMED2.jpg" class="img-responsive img-rounded" />

Compartilhar este post


Link para o post
Compartilhar em outros sites

        include_once 'lib/Simple_html_dom.php';
        include_once 'lib/Simple_html_dom_node.php';
        
        $string = '
            <p>Aliquam vehicula faucibus tellus. Praesent condimentum commodo libero, 
            sit amet pellentesque metus bibendum sit amet. Donec commodo tortor in 
            libero consequat suscipit. Maecenas eget augue vulputate neque pulvinar lobortis. 
            Fusce posuere lorem scelerisque, facilisis velit eu, vehicula nulla. Mauris 
            vestibulum vulputate justo, et tincidunt neque imperdiet eget.</p>
            <img alt="" src="/upload/ckeditor/CARTOAEROMED2.jpg" style="width: 800px; height: 648px;" />
            <img alt="" src="/upload/ckeditor/CARTOAEROMED2.jpg" style="width: 800px; height: 648px;" />
            <img alt="" src="/upload/ckeditor/CARTOAEROMED2.jpg" style="width: 800px; height: 648px;" />';
        
         $html = new Simple_html_dom($string);
         $result = new stdClass;
         foreach($html->find('img') as $img) 
         {
             $src = 'src="/common/function/thumb.php?url=../..' . $img->src . '" class="img-responsive img-rounded" ';       
             $result = preg_replace('/src([=]|\s=)"(.*)"/', $src, $string);
         }      
               
         print_r($result);

Vai precisar dar libs :

http://pastebin.com/gAeU4rd6

 

http://pastebin.com/nAY5tsth

 

Testa ai e me diz se o caminho é este...

Compartilhar este post


Link para o post
Compartilhar em outros sites

PERFEITO!

 

Casou como uma luva! Ele encontra todas as imagens da string e altera exatamente para o que preciso. Muito bom!

$postFinal = $objBlog->Conteudo(); // * String
							
$html = new Simple_html_dom($postFinal);
$result = new stdClass;
							
foreach($html->find('img') as $img)
{
	$src = '"" src="/common/function/thumb.php?url=../..'.$img->src.'&largura=775&altura=550&prefixo=ch_&crop=true" class="img-responsive img-rounded" ';      
	$result = preg_replace('/src([=]|\s=)"(.*)"/', $src, $postFinal);
}
							
$postFinal = $result;

 

 

Porémmmmm, se a string não tiver imagem, ele dá erro!

Catchable fatal error: Object of class stdClass could not be converted to string in /Applications/XAMPP/xamppfiles/htdocs/blog/post.php on line 59

 

E outra dúvida:

Só tô pensando agora em como melhorar isso mais ainda... pois a imagem sempre terá um tamanho "fixo" de largura, e se a imagem vier com uma largura estabelecida no sistema, será que era ideal manter? hahah se o cara no FCK Editor estabelece a largura como 300px, o style fica com 300px. É possível pegar esse atributo do style (no caso, o width) e guardar em uma variável para poder utilizar ainda dentro disso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade, ontem a noite não testei esta possibilidade. Neste caso pode fazer assim:

 

             $html = new Simple_html_dom($string);                
             foreach($html->find('img') as $img) 
             {           
                 if (!empty($img)) 
                 {
                     $src = '"" src="/common/function/thumb.php?url=../..' . $img->src . '" class="img-responsive img-rounded" ';       
                     $string = preg_replace( '/src([=]|\s=)"(.*)"/', $src, $string );    
                 }
                 else
                 {
                     $string = $string;
                 }
                                          
             }      
                                               
            echo $string;

Sem necessidade de um stdClass, vou analisar a questão das tags style eu vou testar aqui e te passo depois ok? :D Foi o sono ontem a noite, mas minha intenção em criar um objeto stdClass era justamente desmembrar as tags dentro deste objeto para uma manipulação posterior.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto a tag style:

 $html = new Simple_html_dom($string);     
             $i = 0;
             foreach($html->find('img') as $img) 
             {      
                 $i++;
                 if (!empty($img)) 
                 {
                     #coleta valores das tag width e height presentes em style
                     preg_match('/width:([\s]?)[\d]{1,}+px;/is',  $img, $style['width'][$i]);
                     preg_match('/height:([\s]?)[\d]{1,}+px;/is', $img, $style['height'][$i]);
                     
                     #opcional recebe apenas números
                    $style['width'][$i]  = preg_replace('/[^\d]/is', '', $style['width'][$i]);
                    $style['height'][$i] = preg_replace('/[^\d]/is', '', $style['height'][$i]);
                      
                     # agora pode-se manter o stylo usando concatenação ou utilizar os valores da forma como quiser. 
                     $src = '"" src="/common/function/thumb.php?url=../..' . $img->src . '" class="img-responsive img-rounded" ';       
                     $string = preg_replace( '/src([=]|\s=)"(.*)"/', $src, $string );    
                 }
                 else
                 {
                     $string = $string;
                 }
                                          
             }      
                                               
            echo $string;
            
            var_dump($style);
            

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Ademilson Opa! Parece que deu certo! Vou analisar melhor aqui e ja confirmo!

 

Com uma imagem só no post, fica perfeito!

 

Porém, com mais de uma, ele duplica a última! :closedeyes:

 

 

 

Como ficou:

 

$string = $objBlog->Conteudo(); // * A String vem deste objeto

$html = new Simple_html_dom($string);     
$i = 0;

foreach($html->find("img") as $img) 
{      
    $i++;
    if (!empty($img)) 
    {
        // * Coleta valores das tag width e height presentes em style
        preg_match("/width:([\s]?)[\d]{1,}+px;/is",  $img, $style["width"][$i]);
        preg_match("/height:([\s]?)[\d]{1,}+px;/is", $img, $style["height"][$i]);
        
        $style["width"][$i]  = preg_replace("/[^\d]/is", "", $style["width"][$i]);
        $style["height"][$i] = preg_replace("/[^\d]/is", "", $style["height"][$i]);
        
        $larguraImg = $style["width"][$i][0];
        $alturaImg = $style["height"][$i][0];
        
        if(($larguraImg > 775) && ($alturaImg > 550))
        {
            $src = " src=\"/common/function/thumb.php?url=../..".$img->src."&largura=775&altura=550&prefixo=chp_&crop=false\" class=\"img-responsive img-rounded\" ";      
        }
        else
        {
            $src = " src=\"/common/function/thumb.php?url=../..".$img->src."&largura=".$style["width"][$i][0]."&altura=".$style["height"][$i][0]."&prefixo=chp_&crop=false\" class=\"img-responsive img-rounded\" ";      
        }
      
        $string = preg_replace('/src([=]|\s=)"(.*)"/',$src, $string);    
    }
    else
    {
        $string = $string;
    }
}

 

Estou testando com essa string:

 

 

<p>Aliquam vehicula faucibus tellus. Praesent condimentum commodo libero, sit amet pellentesque metus bibendum sit amet. Donec commodo tortor in libero consequat suscipit. Maecenas eget augue vulputate neque pulvinar lobortis. Fusce posuere lorem scelerisque, facilisis velit eu, vehicula nulla. Mauris vestibulum vulputate justo, et tincidunt neque imperdiet eget.</p>
<p>Etiam ornare erat ut pulvinar tincidunt. Maecenas fermentum enim eget purus porta, sed luctus enim egestas. Morbi laoreet blandit tellus, non posuere leo tempus sed. Maecenas erat lorem, pulvinar et condimentum eget, aliquet in turpis. Nullam dui tortor, iaculis quis iaculis vitae, elementum id sapien. Proin tristique congue lacus at accumsan. Praesent adipiscing pharetra neque egestas posuere. In faucibus eleifend porta. Sed diam diam, tempus in placerat at, viverra eget ipsum. Praesent nec lobortis enim, pellentesque gravida est. Phasellus vel posuere ipsum, id interdum neque. Praesent quis risus quis urna sodales eleifend sed vel orci. In vestibulum, justo sit amet fermentum ullamcorper, arcu risus hendrerit mi, vitae adipiscing risus nibh vitae sem. Aliquam non justo ligula. Nullam non mollis nisi.</p>
<p><img alt="" src="/upload/ckeditor/CARTOAEROMED2.jpg" style="width: 300px; height: 243px;" /></p>
<p><img alt="" src="/upload/ckeditor/Food_Differring_meal_Greek_Salad_032977_.jpg" style="width: 900px; height: 563px;" /></p>

 

 

E retorna:

 

 

<p>Aliquam vehicula faucibus tellus. Praesent condimentum commodo libero, sit amet pellentesque metus bibendum sit amet. Donec commodo tortor in libero consequat suscipit. Maecenas eget augue vulputate neque pulvinar lobortis. Fusce posuere lorem scelerisque, facilisis velit eu, vehicula nulla. Mauris vestibulum vulputate justo, et tincidunt neque imperdiet eget.</p>
<p>Etiam ornare erat ut pulvinar tincidunt. Maecenas fermentum enim eget purus porta, sed luctus enim egestas. Morbi laoreet blandit tellus, non posuere leo tempus sed. Maecenas erat lorem, pulvinar et condimentum eget, aliquet in turpis. Nullam dui tortor, iaculis quis iaculis vitae, elementum id sapien. Proin tristique congue lacus at accumsan. Praesent adipiscing pharetra neque egestas posuere. In faucibus eleifend porta. Sed diam diam, tempus in placerat at, viverra eget ipsum. Praesent nec lobortis enim, pellentesque gravida est. Phasellus vel posuere ipsum, id interdum neque. Praesent quis risus quis urna sodales eleifend sed vel orci. In vestibulum, justo sit amet fermentum ullamcorper, arcu risus hendrerit mi, vitae adipiscing risus nibh vitae sem. Aliquam non justo ligula. Nullam non mollis nisi.</p>
<p><img alt="" src="/common/function/thumb.php?url=../../upload/ckeditor/Food_Differring_meal_Greek_Salad_032977_.jpg&largura=775&altura=550&prefixo=chp_&crop=false" class="img-responsive img-rounded" /></p>
<p><img alt="" src="/common/function/thumb.php?url=../../upload/ckeditor/Food_Differring_meal_Greek_Salad_032977_.jpg&largura=775&altura=550&prefixo=chp_&crop=false" class="img-responsive img-rounded" /></p>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teste com preg_match_all:

$html = '......';

preg_match_all('@<img(.*?)src="([^\"]+)"([^>]+)>@i', $html, $matches);

$base = '/common/function/thumb.php?url=';

for($i=0, $max = count($matches[0]); $i < $max; $i++) {
	$newUrl = $base . $matches[2][$i];
	$tag = sprintf('<img src="%s" %s %s>', $newUrl, $matches[1][$i], $matches[3][$i]);

	$html = str_replace($matches[0][$i], $tag, $html);
}

echo $html;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sinistro, testei aqui com o mesmo código HTML que postou no exemplo + seu script e não esta duplicando.

 

 

pior que se eu mando dar um Alert nos valores de $img, ele retorna as duas imagens!

Mas em algum momento ele tá se perdendo, substituindo o valor do $img->src para as duas imagens.

 

$string = preg_replace('/src([=]|\s=)"(.*)"/',$src, $string);    

 

Isso aqui tá certo? Ele não vai pegar todo o conteúdo de $string e procurar pelo $src? Acho que é por isso que está duplicando! Pq vai sempre pegar o ultimo $src (no caso, a segunda imagem), localizar as imagens em $string e trocar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@hufersil acabei de fazer um teste aqui, mas assim, como posso adaptá-lo a minha necessidade? Vi que ele fez a troca, mas preciso inserir mais alguns parâmetros após a imagem. O endereço da imagem teria que ficar algo assim:

 

/common/function/thumb.php?url=../../upload/ckeditor/CARTOAEROMED2.jpg&width=500&height=200&crop=true

 

Isso que está em negrito, como faço para adicionar, utilizando seu exemplo? Outra coisa, preciso que o parametro width e height seja dinâmico (venha do style que a imagem tem original), entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, é só acrescentar a regex que vc precisa dentro do loop.

Isso você já tinha feito no post #9, mas vai um exemplo alterado:

 

$base = '/common/function/thumb.php?url=';

for($i=0, $max = count($matches[0]); $i < $max; $i++) {
	$newUrl = $base . $matches[2][$i];
	$width = 0;
	$height = 0;

	if( preg_match('@width:\s*(\d+)px@i', $matches[0][$i], $reg) ) {
		$width = $reg[1];
	}

	if( preg_match('@height:\s*(\d+)px@i', $matches[0][$i], $reg) ) {
		$height = $reg[1];
	}

	$newUrl .= sprintf('&width=%d&height=%d&crop=true',$width,$height);

	$tag = sprintf('<img src="%s" %s %s>', $newUrl, $matches[1][$i], $matches[3][$i]);

	$html = str_replace($matches[0][$i], $tag, $html);
}

echo $html;

Compartilhar este post


Link para o post
Compartilhar em outros sites

+ include('simple_html_dom.php');

 

       foreach($html->find('img') as $header){
       $im[]= $header->src . '<br>';
       $im[]= $header->plaintext;


}

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.