Ir para conteúdo

POWERED BY:

Arquivado

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

usuario181474618518

Substituir array por array com preg_replace

Recommended Posts

Bom dia a todos! 

 

Estou iniciando em PHP, então talvez isso seja uma pergunta burra. Estou utilizando uma plataforma que fornece um array de categorias como digitado abaixo, e minha ideia é fazer uma busca no conteúdo por essas categorias, e substituir elas por outro array, que no caso terá as mesmas categorias, no entanto, com links. Veja:

$conteudo = "Meu conteúdo Filmes Laranja e Verde. Blackout.";

$from = array(
	0 => "Laranja",
	1 => "Azul",
	2 => "Vermelho",
	3 => "Verde",
	4 => "Black"
);

$to = array(
	0 => "<a href='#laranja'>Laranja</a>",
	1 => "<a href='#azul'>Azul</a>",
	2 => "<a href='#vermelho'>Vermelho</a>",
	3 => "<a href='#verde'>Verde</a>",
	4 => "<a href='#ver'>Black</a>"
);

$novoconteudo = strtr($conteudo, array_combine($from, $to));

echo $novoconteudo;

 

O máximo que conseguir fazer foi usando strtr, no entanto acaba fazendo algumas substituições "burras", como por exemplo adicionar link em "Black" quando na verdade a palavra é "Blackout". Acredito que para resolver isso, deveria ser feito com preg_replace, porém já tentei e não consegui. Alguém pode me ajudar?

 

Veja: http://sandbox.onlinephpfunctions.com/code/e7cfd27ea182041de0519df3ed22bedc93cda18b

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nenhuma pergunta é burra.

 

Indiferente com a escolha, você terá resultados bem similares... é um problema de escopo. A palavra que você procura pode estar em diferentes locais.

  • Início/meio/fim de frase;
  • Antes de pontuação (. , ! ? : ;);
  • Entre apóstrofos.
  • etc...

O mais fácil para resolver isso, seria utilizar uma marcação simples, tal qual

Back in [a]Black[/a]

E utilizar as marcações como delimitadores.

 

De outra forma, seria pegar todas as situações que podem ocorrer, e tratar cada uma independentemente.

 

Você pode começar com essa expressão regular e ir ampliando ela:

((?!\w)|[\t\n\r ])(?<word>black)(?!\w)

Ela não está completa, não cobre todas as possibilidade, mas cobre a maioria delas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Olá usuario181474618518,

 

Bom, entendi o que desejava fazer, então, criei um script referente ao que desejava.

Como foi o meu pensamento para chegar a esse resultado.

 

1  - Criar uma função para resolver o problema podendo reutilizar em outras áreas.

2-  ter 3 parâmetros para utilizar a função, 1 o array de menu, o conteúdo em string(texto) e um array de caracteres não importantes.

 

 

Criação da função:

Os passos:

 

1 - Verificar se existe os caracteres a serem removidos do conteúdo.

2 - criar um array através do conteúdo, carácter escolhido ESPAÇO.

3 - Percorrer os o arrMenu e o conteúdo fazendo a comparação se o valor do menu e igual a cada item gerado do conteúdo.

4 - gerar a lista UL>LI caso exista o menu list.

5 - Remover os itens duplicados do arrayMenu

6 - Gera a lista

7 - Retornar a lista

 

Segue o script abaixo:

 

Observação:

Esses itens abaixo, e para ser personalizado com a url e como deseja mostrar cada item de menu. 

$url  = '#';
$list = $list;

 

 

 

 

 

 

 

<?php 
$from = array(
	0 => "Laranja",
	1 => "Azul",
	2 => "Vermelho",
	3 => "Verde",
	4 => "Black"
);
$conteudo = "Meu conteúdo Filmes Laranja e Verde. Blackout.";

$menuslist = listCategoryMenu($from,$conteudo, [ '.',',' ]);
echo $menuslist;

function listCategoryMenu(array $arrMenu, string $contents, array  $arrRemove){
	$contents = $contents;
	$arrMenuList = null;
	
	if(is_array($arrRemove) && sizeof($arrRemove) > 0 ):
		$contents  = str_replace($arrRemove,'',$contents);
	endif;
	
	$contents = explode(' ',$contents);
	
	foreach($arrMenu as $keys => $values):
		foreach($contents as $content):
			if($values == $content):
				$arrMenuList[] = $content;
			endif;
		endforeach;
	endforeach;
	
	
	$html = null;
	if(is_array($arrMenuList) && sizeof($arrMenuList) > 0 ):
		$arrMenuList = array_unique($arrMenuList);
		$html .= '<ul>';
			foreach($arrMenuList as $list):
				$url  = '#';
				$list = $list;
				$html .= sprintf('<li><a href="%s">%s</a></li>',$url,$list);
			endforeach;
		$html .=  '</ul>';
	endif;
	
	return $html;
}

 

 

 

 

  Em 28/02/2020 at 06:53, usuario181474618518 disse:

Bom dia a todos! 

 

Estou iniciando em PHP, então talvez isso seja uma pergunta burra. Estou utilizando uma plataforma que fornece um array de categorias como digitado abaixo, e minha ideia é fazer uma busca no conteúdo por essas categorias, e substituir elas por outro array, que no caso terá as mesmas categorias, no entanto, com links. Veja:

$conteudo = "Meu conteúdo Filmes Laranja e Verde. Blackout.";

$from = array(
	0 => "Laranja",
	1 => "Azul",
	2 => "Vermelho",
	3 => "Verde",
	4 => "Black"
);

$to = array(
	0 => "<a href='#laranja'>Laranja</a>",
	1 => "<a href='#azul'>Azul</a>",
	2 => "<a href='#vermelho'>Vermelho</a>",
	3 => "<a href='#verde'>Verde</a>",
	4 => "<a href='#ver'>Black</a>"
);

$novoconteudo = strtr($conteudo, array_combine($from, $to));

echo $novoconteudo;

 

O máximo que conseguir fazer foi usando strtr, no entanto acaba fazendo algumas substituições "burras", como por exemplo adicionar link em "Black" quando na verdade a palavra é "Blackout". Acredito que para resolver isso, deveria ser feito com preg_replace, porém já tentei e não consegui. Alguém pode me ajudar?

 

Veja: http://sandbox.onlinephpfunctions.com/code/e7cfd27ea182041de0519df3ed22bedc93cda18b

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por clovis.sardinha
      Bom dia.
      Meu problema é o seguinte:
      Estou fazendo uma tabela e preciso mostrar o usuário e várias cidades que pertencem a este usuário.
      O resultado do array é o seguinte:

      Quando passo para a tabela os valores de cidade se repetem para o mesmo usuário até o final e retorna fazendo o mesmo para o próximo usuário. 
      Veja abaixo

       
      Meu código para a tabela é a seguinte:
      <tr> <td align="left"><?php echo $usuario['nome'] ?></td> <td align="left"><?php echo $usuario['nome_orgao'] ?></td> <td align="left"><?php echo $usuario['nome_funcao'] ?></td> <?php foreach($destinos as $key=>$destino):?> <?php $key=0;?> <td align="left"> <?php foreach($destino as $chave=> &$cidade): ?> <?php echo $cidade['cid_nome']."-";?> <?php endforeach;?> </td> <?php $key+=$key; ?> <?php endforeach;?> <td><?php echo date('d/m/Y', strtotime( $usuario['created_at'])) ?></td> <td align="left"><a href="<?php echo base_url('UserAdmin/Usuario/getUsuarioById')."/".$usuario['id_user'] ?>">DETALHES</a></td> </tr> <?php endforeach ?> Onde estou errando? O que tenho de fazer para percorrer este array de modo a aparecer apenas as cidades pertencentes a cada usuário?

    • Por Giovanird
      Listo um array pelo foreach e preciso pegar os valores fora do foreach.
      Abaixo tenho o exemplo do foreach com os valores
       
      <?php foreach($turma $rsturma): if(($rsturma['id'] == 1){ echo $rsturma['nome']."<br>"; echo $rsturma['idade']."<br><br>"; } endforeach; //Dentro do foreach me retorna: Luis 13 Maria 12 Carlos 12 Matheus 14 Andréa 12 //Preciso pegar a posição e o valor desta lista $posicao1 = 1; $nome1 = Luis; $posicao2 = 2; $nome2 = Maria; $posicao3 = 3; $nome3 = Carlos; $posicao4 = 4; $nome4 = Matheus; $posicao5 = 5; $nome5 = Andréa;  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.