Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
>
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:
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\=[\\]?\'\"'
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> LegendaNisso:
<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
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.
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\=[\\]?\'\"'
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.