Ir para conteúdo

POWERED BY:

Arquivado

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

cassiano óliver

[Resolvido] Pegar conteúdo de string delimitada por {...}

Recommended Posts

Boa tarde pessoal,

 

Como eu posso pegar um conteúdo que esteja entre { }?

EX: {galeria=4);

 

quero pegar o "4", que seria um ID.

 

Isto vai servir para exibir uma galeria de fotos em um determinado trecho de texto. Insiro este "comando" em um texto, e o substituo por uma galeria. A parte de substituição já está funcionando, só que quero automatizar e para isso preciso do ID da galeria.

 

A substituição é feita assim: $conteudo = str_replace('{galeria=4}', galeria($cnx, ID), $conteudo);

Por isso pensei em passar o ID no código, o problema é que não consigo resgatá-lo em meio ao conteúdo da página, que poderia estar assim:

 

<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis eleifend. Mauris tincidunt lectus in libero. Suspendisse interdum lectus vitae urna. Morbi vitae enim vel justo dapibus porttitor. Vivamus convallis nisl id mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis malesuada, lacus a aliquam feugiat, ligula dolor pulvinar ipsum, nec sodales est orci vitae odio. Cras urna velit, ullamcorper sit amet, vehicula id, facilisis eget, odio. Integer pretium rhoncus nibh. Vestibulum mollis euismod odio.</p>

<p>Curabitur dictum. Integer egestas placerat ligula. Nunc eleifend. Suspendisse et dui. Praesent tristique. Vestibulum mattis. In hac habitasse platea dictumst. Nullam facilisis orci sed augue. Maecenas turpis. Integer mattis auctor tortor.</p>
{galeria=4}

Se alguém puder me ajudar..

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
$texto = '<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis eleifend. Mauris tincidunt lectus in libero. Suspendisse interdum lectus vitae urna. Morbi vitae enim vel justo dapibus porttitor. Vivamus convallis nisl id mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis malesuada, lacus a aliquam feugiat, ligula dolor pulvinar ipsum, nec sodales est orci vitae odio. Cras urna velit, ullamcorper sit amet, vehicula id, facilisis eget, odio. Integer pretium rhoncus nibh. Vestibulum mollis euismod odio.</p>

<p>Curabitur dictum. Integer egestas placerat ligula. Nunc eleifend. Suspendisse et dui. Praesent tristique. Vestibulum mattis. In hac habitasse platea dictumst. Nullam facilisis orci sed augue. Maecenas turpis. Integer mattis auctor tortor.</p>
{galeria=4}';
preg_match_all('/{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([0-9]+)}/', $texto, $var);
echo '<pre>';
print_r($var);
?>

Resultado: http://matheustavares.com.br/imasters/preg_match_all_cassiano.php

 

Array

(

[0] => Array

(

[0] => {galeria=4}

)

 

[1] => Array

(

[0] => galeria

)

 

[2] => Array

(

[0] => 4

)

 

)

Modo de leitura do ID:

 

echo $var[2][0];

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Abaixo vai um link que vai te ajudar a entender melhor ER Cassiano.

 

Entendendo ER

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o formato de entrada for SEMPRE conhecido, sscanf() é uma boa escolha.

 

print_r( sscanf( '{galeria=4}', '{galeria=%d}' ) );

 

Se ele não tão conhecido assim (como '{opcaoqualquer=4}') você pode usar parse_url() também para interpretar essa query string.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Periscuelo,

 

Obrigado pelo link. Vou dar uma lida assim que possível.

 

 

@André,

 

Obrigado pela sugestão.

Não conhecia estas funções, vou dar uma estudada depois.

 

 

 

Agora me deparei com outro probleminha. Consigo pegar o ID e substituir o código por uma galeria.

Estou tentando agora, utilizar mais de um código no mesmo texto, então criei um loop com foreach, porém a substituição só funciona com 1 código.

 

EX:

Se eu fizer assim, funciona apenas no último {codigo}.

preg_match_all('/{([a-zA-Z0-9]+)?[,;:=-]{1}?([0-9]+)}/', $dados->conteudo, $galeriaID);
$IDs = $galeriaID[2];
	
foreach($IDs as $id) {
	$c .= str_replace("{galeria=$id}", "galeria $id", $dados->conteudo);
}

Assim, funciona apenas no 1º

$c = str_replace("{galeria=$id}", "galeria $id", $dados->conteudo);

Colocando um echo $id no foreach, ele retorna os ids corretamente.

 

A saída então, deveria ser assim:

 

galeria 4

galeria 1

 

porém está assim:

 

galeria 4

{galeria=1}

 

ou

 

{galeria=4}

galeria 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O exemplo que te enviei está funcionando 100%, peço que leia com calma novamente e volte a postar os resultados.

 

Quanto à explicação da ER:

 

{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([0-9]+)}

{ -> Deve começar com um {

([a-zA-Z0-9]+) -> Cria-se um grupo, que será mantido no resultado final da array $var, onde DEVE estar contido caracteres de a-z, independentemente de maiusc. ou minusc. e/ou números de 0,9

" ?" -> (aspas adicionadas para notar o espaço) Pode OU NÃO conter um espaço entre o grupo anterior e o caractere separador que virá a seguir

[,;:=-]{1} -> Deve conter um único caractere separador, seja ele qualquer um dos que estão dentro dos colchetes

" ?" -> (aspas adicionadas para notar o espaço) Pode OU NÃO conter um espaço entre o caractere separador e o ID, que virá a seguir

([0-9]+) -> Aqui vem o ID, que pode ser qualquer número inteiro de 0-9, independentemente de seu valor

} -> Deve terminar com }

 

Lembrando novamente: MODO DE LEITURA DO ID: echo $var[2][0];

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Matheus,

 

Mais uma vez obrigado pela atenção.

 

O códido que passou, está funcionando sim, perfeitamente.

A dificuldade agora, está no loop, não sei porquê somente um código é substituído.]

 

Código:

$query = $cnx->query("SELECT conteudo FROM paginas WHERE nome = 'Acomodações'");
	$dados = $query->fetch();
	preg_match_all('/{([a-zA-Z0-9]+)?[,;:=-]{1}?([0-9]+)}/', $dados->conteudo, $galeriaID);
	$IDs = $galeriaID[2];
	
	foreach($IDs as $id) {
		$c = str_replace("{galeria=$id}", "galeria $id", $dados->conteudo);
	}
	
	echo $c;

Dando um print_r em $IDs, obtenho:

Array
(
    [0] => 4
    [1] => 1
)

no foreach, dando um echo $id, obtenho:

4
1

Até aí, entendo que está perfeito, porém no str_replace do foreach, ou substitui o 1º código, ou o último...

 

Conteúdo original:

Galeria 1

 

{galeria=1}

 

Galeria 4

 

{galeria=4}

 

O foreach, me retorna isso:

Galeria 1

{galeria=1}

Galeria 4

galeria 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para substituição, faça da seguinte forma:

 

<?php
$texto = '<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis eleifend. Mauris tincidunt lectus in libero. Suspendisse interdum lectus vitae urna. Morbi vitae enim vel justo dapibus porttitor. Vivamus convallis nisl id mi. {umaCategoriaQualquerAqui=10} Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis malesuada, lacus a aliquam feugiat, ligula dolor pulvinar ipsum, nec sodales est orci vitae odio. Cras urna velit, ullamcorper sit amet, vehicula id, facilisis eget, odio. Integer pretium rhoncus nibh. Vestibulum mollis euismod odio.</p>

<p>Curabitur dictum. Integer egestas placerat ligula. Nunc eleifend. Suspendisse et dui. Praesent tristique. Vestibulum mattis. In hac habitasse platea dictumst. Nullam facilisis orci sed augue. Maecenas turpis. Integer mattis auctor tortor.</p>
{galeria=4}';

echo preg_replace('/{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([0-9]+)}/', '<b>A CATEGORIA ESPECIFICADA FOI $1, CUJO ID FOI $2</b>', $texto);
?>

Resultado: http://matheustavares.com.br/imasters/preg_replace_cassiano.php

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, funcionou!

Só que no meu caso, estou substituindo por uma função. e não dá para usar $2.

echo preg_replace('/{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([0-9]+)}/', galeria($cnx, $2), $dados->conteudo);
Dá para usar outro nome de variável?

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
$texto = '<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis eleifend. Mauris tincidunt lectus in libero. Suspendisse interdum lectus vitae urna. Morbi vitae enim vel justo dapibus porttitor. Vivamus convallis nisl id mi. {umaCategoriaQualquerAqui=10} Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis malesuada, lacus a aliquam feugiat, ligula dolor pulvinar ipsum, nec sodales est orci vitae odio. Cras urna velit, ullamcorper sit amet, vehicula id, facilisis eget, odio. Integer pretium rhoncus nibh. Vestibulum mollis euismod odio.</p>

<p>Curabitur dictum. Integer egestas placerat ligula. Nunc eleifend. Suspendisse et dui. Praesent tristique. Vestibulum mattis. In hac habitasse platea dictumst. Nullam facilisis orci sed augue. Maecenas turpis. Integer mattis auctor tortor.</p>
{galeria=4}';

echo preg_replace('/{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([0-9]+)}/e', "strlen($2)", $texto);
?>

Basta utilizar o modificador /e. Utilizei a função strlen() como exemplo, mas pode-se utilizar qualquer uma.

 

Resultado: http://matheustavares.com.br/imasters/preg_replace_cassiano2.php

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que continua passando o valor como string.

Tentei converter, mas retorna sempre 0;

 

echo preg_replace('/{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([0-9]+)}/e', galeria($cnx, "$2"), $dados->conteudo);

function galeria($cnx, $id) {
	$idn = (int)$id;
	return var_dump($idn);
	
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda retorna erro.

Catchable fatal error: Object of class PDO could not be converted to string in C:\Program Files\xampp\htdocs\dolcevita\conteudo\paginas\fotos.php on line 7

echo preg_replace('/{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([a-zA-Z0-9]+)}/e', "galeria($cnx, $2)", $dados->conteudo);

function galeria($cnx, $id) {
	return $id;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
$texto = '<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis eleifend. Mauris tincidunt lectus in libero. Suspendisse interdum lectus vitae urna. Morbi vitae enim vel justo dapibus porttitor. Vivamus convallis nisl id mi. {umaCategoriaQualquerAqui=10} Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis malesuada, lacus a aliquam feugiat, ligula dolor pulvinar ipsum, nec sodales est orci vitae odio. Cras urna velit, ullamcorper sit amet, vehicula id, facilisis eget, odio. Integer pretium rhoncus nibh. Vestibulum mollis euismod odio.</p>

<p>Curabitur dictum. Integer egestas placerat ligula. Nunc eleifend. Suspendisse et dui. Praesent tristique. Vestibulum mattis. In hac habitasse platea dictumst. Nullam facilisis orci sed augue. Maecenas turpis. Integer mattis auctor tortor.</p>
{galeria=4}';

function galeria($cnx=1, $id) {
        return $id;
}
echo preg_replace('/{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([a-zA-Z0-9]+)}/e', "galeria(1, $2)", $texto);
?>

Resultado: http://matheustavares.com.br/imasters/preg_replace_cassiano2.php

 

Provavelmente o erro está no "$dados->conteudo". Tente registrar o texto desse objeto numa variável comum.

 

To indo dormir, amanhã retorno para ver seu progresso.

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma vez obrigado pelo apoio Matheus!

Irei testar assim que chegar em casa.

 

Matheus,

O erro na verdade, é porque $cnx, que é o objeto que cria conexão é enviado como string.

Criei uma nova conexão dentro da função, aí funcionou. Está ok.

 

Tentei fazer uma pequena adaptação em sua ER, porém sem sucesso.

Como utilizo o tinymce, ao informar o código {galeria=id}, ele retorna assim: <p>{galeria=id}</p>.

 

Como posso eliminar a tag <p>?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, não sei se está da forma mais correta, mas consegui...

 

/\<p\>{([a-zA-Z0-9]+) ?[,;:=-]{1} ?([a-zA-Z0-9]+)}\<\/p\>/e

Matheus, mais uma vez, muito obrigado pelo apoio!

Abraços

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.