Ir para conteúdo
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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • 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.