Ir para conteúdo

Arquivado

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

Master_Cyber

Mudar valor de variável com expressão regular

Recommended Posts

Boa tarde pessoal, estou com uma dúvida, tenho uma variável que tem o seguinte conteúdo:

$string = " <strong>Meu Post</strong>
		
            <br/>

	    <p style=\'text-align: left;\'>Teste</p>

	    [video width=\'360\' height=\'640\' mp4=\'http://youtube.com/video1'][/video]";

Gostaria de pegar o conteúdo do atributo mp4 e mudar o valor de $string para ficar da seguinte forma:

$string = " <strong>Meu Post</strong>
		
            <br/>

	    <p style=\'text-align: left;\'>Teste</p>

            <video width='100%'  preload='metadata' controls='controls'>
                 <source type='video/mp4' src='http://youtube.com/video1'>
	    </video>";

Entenderam?

 

Acredito que devo fazer isso com expressão regular, mas não sei como.

 

Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nos casos de substituição mais complexa, eu recomendo a abordagem com uma estrutura de controle (ao invés da expressão regular). O que pode ser visto no link abaixo:

http://forum.imasters.com.br/topic/506095-localizar-duas-palavras-e-eliminar-todo-o-conteudo-entre-elas/

 

Já com expressão regular, você teria que realizar o tratamento em duas etapas, pois é um tanto complexo, em apenas uma ER, retornar o texto, encontrar a posição exata do atributo mp4, retornar o valor do atributo e, então, substituir tudo. Se for mutável (quantidade e posição de atributos, além dos valores) você terá uma ER muito complexa e abrangente para algo que pode ser simplificado em dois passos.

 

No mais, poderia encontrar os placeholders, através da seguinte ER:

'(\[video[^\]]+]\[\/video\])'

A ER acima utilizada, na sua string, retornará o seguinte trecho:

'[video width=\'360\' height=\'640\' mp4=\'http://youtube.com/video1'][/video]'

E, à partir do valor retornado, retornar o atributo mp4 e substituir com o str_replace (sim, str_replace ao invés de preg_replace).

mp4\=[\\]?[\'\"](?P<mp4>[^'"]+)'

A ER acima, retornará um atributo, denominado mp4, que conterá o valor de mp4 na string. Depois substitua a string retornada (pela primeira ER) pela sua nova string formatada.

 

PS.: Estou sem servidor PHP para testar códigos em PHP (preg_match, preg_match_all, etc...), mas as ER's acima todas estão de acordo com o esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nos casos de substituição mais complexa, eu recomendo a abordagem com uma estrutura de controle (ao invés da expressão regular). O que pode ser visto no link abaixo:

http://forum.imasters.com.br/topic/506095-localizar-duas-palavras-e-eliminar-todo-o-conteudo-entre-elas/

 

Já com expressão regular, você teria que realizar o tratamento em duas etapas, pois é um tanto complexo, em apenas uma ER, retornar o texto, encontrar a posição exata do atributo mp4, retornar o valor do atributo e, então, substituir tudo. Se for mutável (quantidade e posição de atributos, além dos valores) você terá uma ER muito complexa e abrangente para algo que pode ser simplificado em dois passos.

 

No mais, poderia encontrar os placeholders, através da seguinte ER:

'(\[video[^\]]+]\[\/video\])'

A ER acima utilizada, na sua string, retornará o seguinte trecho:

'[video width=\'360\' height=\'640\' mp4=\'http://youtube.com/video1'][/video]'

E, à partir do valor retornado, retornar o atributo mp4 e substituir com o str_replace (sim, str_replace ao invés de preg_replace).

mp4\=[\\]?[\'\"](?P<mp4>[^'"]+)'

A ER acima, retornará um atributo, denominado mp4, que conterá o valor de mp4 na string. Depois substitua a string retornada (pela primeira ER) pela sua nova string formatada.

 

PS.: Estou sem servidor PHP para testar códigos em PHP (preg_match, preg_match_all, etc...), mas as ER's acima todas estão de acordo com o esperado.

 

Opa amigo, muito obrigado, consegui resolver um dos meus problemas.

 

Meu código ficou assim:

function getTextRange($positionStart, $positionEnd, $wordStart, $wordEnd, $text){
    $data = array();
    while (($positionStart = strpos($text, $wordStart, $positionEnd)) !== FALSE) {
        $positionStart += strlen($wordStart);
        $positionEnd = strpos($text, $wordEnd, $positionStart);

        $data[] = substr($text, $positionStart, $positionEnd - $positionStart);
    }
    
    return $data;
}

E chamo essa função dessa forma:

$string = " <strong>Meu Post</strong>
		
            <br/>

	    <p style=\'text-align: left;\'>Teste</p>

	    [video width=\'360\' height=\'640\' mp4=\'http://youtube.com/video1'][/video]";


$urlVideo = getTextRange(0, 0, 'mp4="', '.mp4', $string);

if($urlVideo){
    foreach ($urlVideo as $url) {
         $video = "<video width='100%' preload='metadata' controls='controls'>";
         $video .= "<source type='video/mp4' src='{$url}'.mp4>";
         $video .= "</video>";

         $text = preg_replace('@\[video[^\]]*?\].*?\[/video\s*\]@si', $video, $text, 1);
    }
} 

Coloquei dentro de um foreach pois podem haver várias tags dentro dessa variável.

 

Funcionou perfeitamente... Mas preciso fazer a mesma coisa só que com imagens:

 

Transformar isso:

[caption id=\"attachment_1468\" align=\"alignnone\" width=\"300\"]
     <a href=\"imagem1.jpg\">
	 <img src=\"imagem1.jpg\" alt=\"Legenda\" width=\"300\" height=\"224\" />
      </a> Legenda
[/caption] 

Nisso:

<figure id="attachment_1468" style="width: 300px;" >
     <img src="imagem1.jpg" alt="Legenda" width="300" height="224">
      <figcaption class="caption-text">Legenda</figcaption>
</figure> 

Então eu fiz isso:

$urlImagem = getTextRange(0, 0, 'src="', '"', $text);
    
    if($urlImagem){
        foreach ($urlImagem as $urlImg) {
            $img = "<figure style = 'width: 300px;' class = 'wp-caption alignnone'> ";
            $img .= "<img class = 'size-medium wp-image-1468' src='{$urlImg}' alt = 'Legenda' width = '300' height = 'auto'>";
            $img .= "</figure>";
                    
            $text = preg_replace('@\[caption[^\]]*?\].*?\[/caption\s*\]@si', $img, $text, 1);
        }
    }

O problema é que tem imagens que não vem vem dentro dessa tag caption, vem na tag <img ...>, que também existe o atributo src, então meu $urlImagem acaba pegando. Eu precisaria pegar o src que está somente dentro da tag [caption].

 

Entendeu? Espero que sim, porque já estou ficando doido kkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

O procedimento é praticamente o mesmo, exceto que, internamente, você fará outras validações.

 

Você pode utilizar apenas por '<img' até '/>' ou, também, realizar a alteração primeiramente com um padrão e, após, com outro.

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.