Jump to content
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

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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

 

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Giuliano Maffei
      Oi Pessoal, sou novo por aqui.
      Agradeço se alguém puder me ajudar.
      Tenho um banco de dados com a tabela abaixo:
      DB pets
      ------------------------------------------------------------------------------------
      | id | pet_tutor | pet_name | pet_species | pet_breed  |
      ------------------------------------------------------------------------------------
      | 1  |        José |             Rex |                   1 |    Vira-latas |
      | 2  |      Paulo |      Bichano |                  2 |        Siamês |
      | 3  |       João |             Max |                  1 | Lhasa-apso |
      ------------------------------------------------------------------------------------
       
      Fiz o código abaixo:
      $species_lang = array('0' => 'Selecionar','1' => 'Cachorro', '2' => 'Gatos', '3' => 'Acarás');
       
      SELECT (pets.id as id, pet_tutor, pet_name, {(" . $species_lang['pet_species'] . ")}, pet_breed FROM pets)
       
      Resultado:
      -----------------------------------------------------------------------------------
      | id | pet_tutor | pet_name | pet_species | pet_breed  |
      ------------------------------------------------------------------------------------
      | 1  |        José |             Rex |                        | Vira-latas |
      | 2  |       Paulo |    Bichano |                        |     Siamês |
      | 3  |        João |           Max |                        | Lhasa-apso |

      -----------------------------------------------------------------------------------
      Porque não consigo carregar o campo 'pet_species' com a raça do pet. Alguém tem uma luz pra me ajudar?
       
      Obrigado
    • By AlexandrePrezzi
      Por favor se alguem puder me tira essa dúvida 
       
      Por exemplo tenho 2 arrays de mesmo tamanho e gostaria somar os valores  (mesmo indice )  e colocar em um terceiro array
       
      Exemplo
      <?php $array1 = array(1, 2, 3, 4, 5, 6); $array2 = array(7, 8, 9, 10, 11, 12); ou seja .. o resultado seria um novo array $array3(1+7; 2+8, 3+9,...) e assim por diante ......
       
      Qual seria a forma correta de fazer isso ?
       
      Os dois primeiros arrays ja tenho... me falta criar o terceiro com o resultado desejado....
       
      Obrigado
    • By lezão
      Boa tarde, pessoal!
      tenho um codigo que peguei de uma video aula, na video aula funciona normal, mas comigo naun esta funcionando!
      os codigos estaun identicos e em meu server naun roda.
      alguem pode me ajudar?
       
      veja o codigo index.php
      <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <title>Carrinho de Compras</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" /> </head> <body> <div class="container"> <div class="row"> <?php $pdoConnection = require("conexao.php"); $sql = mysqli_query($link, "SELECT * FROM tab_pedido"); //$qr = mysql_query($sql) or die (mysql_error()); while($line = mysqli_fetch_array($sql)){ $Nome_produto = $line['Nome_produto']; $Valor_produto = $line['Valor_produto']; $Descricao_produto = $line['Descricao_produto']; $Foto_produto = $line['Foto_produto']; $id_produtos = $line['id_produtos']; ?> <div class="col-4"> <div class="card"> <div class="card-body"> <h4 class="card-title"><?php echo $Nome_produto;?></h4> <h4 class="card-title"><img src="<?php echo $Foto_produto; ?>" style="border-radius: 10px;" width="75px" height="75px" /></h4> <h6 class="card-subtitle mb-2 text-muted"> R$<?php echo number_format($Valor_produto, 2, ',', '.')?> </h6> <a class="btn btn-primary" href="teste_carrinho.php?acao=add&id=<?php echo $id_produtos;?>" class="card-link">Comprar</a> </div> </div><br/> </div> <?php } ?> </div> </div> </body> </html> codigo carrinho.php
      <?php session_start(); if(!isset($_SESSION['carrinho'])){ $_SESSION['carrinho'] = array(); } //ADICIONA PRODUTOS if(isset($_GET['acao'])){ //ADICIONAR CARRINHO if($_GET['acao'] == 'add'){ $id = intval($_GET['id_produtos']); if(!isset($_SESSION['carrinho'][$id])){ $_SESSION['carrinho'][$id] = 1; } else { $_SESSION[‘carrinho’][$id] += 1; } } //REMOVER CARRINHO if($_GET['acao'] == 'del'){ $id_produtos = intval($_GET['id_produtos']); if(isset($_SESSION['carrinho'][$id_produtos])){ unset($_SESSION['carrinho'][$id_produtos]); } } //ALTERAR QUANTIDADE if($_GET['acao'] == 'up'){ if(is_array($_POST['prod'])){ foreach($_POST['prod'] as $id_produtos => $qtd){ $id_produtos = intval($id_produtos); $qtd = intval($qtd); if(!empty($qtd) || $qtd <> 0){ $_SESSION['carrinho'][$id_produtos] = $qtd; }else{ unset($_SESSION['carrinho'][$id_produtos]); } } } } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" /> </head> <body> <div class="container"> <div class="card mt-5"> <div class="card-body"> <h4 class="card-title">Carrinho</h4> <a href="teste_index.php">Lista de Produtos</a> </div> </div> <form action="?acao=up" method="post"> <table class="table table-strip"> <thead> <tr> <th>Produto</th> <th>Quantidade</th> <th>Preço</th> <th>Subtotal</th> <th>Ação</th> </tr> </thead> <tbody> <?php if(count($_SESSION['carrinho']) == 0){ echo'<tr> <td colspan="5">Não há produto no carrinho</td> </tr>'; } else { include "conexao.php"; $total = 0; foreach($_SESSION['carrinho'] as $id_produtos => $qtd){ $sql = "SELECT * FROM tab_pedido WHERE id_produtos = '$id_produtos'"; $qr = mysql_query($sql) or die (mysql_error()); $ln = mysql_fetch_assoc($qr); $Nome_produto = $ln['Nome_produto']; $Valor_produto = number_format($ln['Valor_produto'], 2, ',', '.'); $sub = number_format($ln['Valor_produto'] * $qtd, 2, ',', '.'); $total += $ln['Valor_produto'] * $qtd; echo ' <tr> <td>'.$Nome_produto.'</td> <td><input type="text" size="3" name="prod['.$id_produtos.']" value="'.$qtd.'" /></td> <td>R$ '.$Valor_produto.' </td> <td>R$ '.$sub.'</td> <td><a href="?acao=del&id_produtos='.$id_produtos.'">Remove</a></td> </tr>'; } $total = number_format($total, 2, ',','.'); echo '<tr> <td colspan="4">Total</td> <td>R$ '.$total.'</td> </tr>'; } ?> </tbody> </form> </table> </body> </html> aonde eu estou errando????
    • By clovis.sardinha
      Estou tentando mandar e-mail para vários usuários, mas só vai para o primeiro, quando tento colocar para vários dá erro. Alguém pode sugerir como fazer?
       
      if ($this->form_validation->run() == true) {             $this->load->model('emailReplayModel');             $user=$this->emailReplayModel->emailreplay(); //$user tem os dados dos usuários que quero mandar -veja abaixo                                  foreach ($user as &$i){                                  $this->email->from("atendimento@portaldapermuta.com", 'Portal da Permuta');             $this->email->subject("Continue seu cadastramento no Portal - é facil");             $email=$i['email'];             $this->email->to($email);             $msg=$this->load->view('usuario/emailReplayFinal',array($senha,'senha' =>$i['senha'],$nome,'nome'=>$i['nome_interessado']),TRUE);             $this->email->message($msg);             $this->email->send();                                         }             $this->email->send();                      if($this->email->send())    {                                      $this->session->set_flashdata('success', 'Mensagens enviadas.');                 redirect('admin/painel/painel_adm');             }  
      debug do $user:
      [user] => Array ( [0] => Array ( [id_interessado] => 23595 [nome_interessado] => CLOVIS [senha] => xxxx [email] => clovis.sardinha@teste2.com [data_inscricao] => 2020-10-12 14:35:43 ) [1] => Array ( [id_interessado] => 23596 [nome_interessado] => ANDRADE [senha] => xxxxx [email] => clovis.sardinha@teste3.com [data_inscricao] => 2020-10-12 16:22:27 ) )  
    • By FabianoSouza
      Tenho um campo de descrição no meu sistema... nesse campo preciso fazer um replace de alguns "substrings" que podem existir.
      Exemplos:
      <apelido>apelido</apelido>
      <saudacao>saudacao</saudacao>
       
      Usando CASE e REPLACE para tratar essas substrings aí de cima, funciona para um caso ou para o outro, não ambos.
      Vejam como estou aplicando o SQL.
      ... , CASE WHEN MWA.descMsg LIKE '%'+'<saudacao>saudacao</saudacao>'+'%' Then REPLACE(MWA.descMsg, '<saudacao>saudacao</saudacao>', dbo.saudacao(GETDATE())) WHEN MWA.descMsg LIKE '%'+'<apelido>apelido</apelido>'+'%' Then REPLACE(MWA.descMsg, '<apelido>apelido</apelido>', '[Apelido]') ELSE MWA.descMsg END AS msg ... Preciso fazer com que esse tratamento seja aplicado para todas as situações, não apenas para uma das duas situações.
      O lance é que não tenho como colocar o campo tratado numa variável e ir aplicando o tratamento a ela de forma isolada.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.