0

Capturar informações em um string

criado por Hugo Campos em 23/02/2010 6:54pm
Boa noite,

Eu to com um problema que não sei como resolver. Vo explica abaixo.

$string1 = "Jose d silva"
$string2 = "Eu tav andando na rua em encontrei o jose da silva";

O que eu quero com isso, eu queria negrita ou marca o nome jose da silva que esta na string2, para isso eu estaria usando a string1 como referencia.

Será que alguem tem alguma ideia de como eu possa resolver este problema?

Lista de Respostas:

+1
23/02/2010 7:09pm
(~15 anos atrás)
Uma forma simples é com str_replace:

<?php
$nome
= 'abc';
$texto
= 'Encontrei o abc na rua e o abc me chamou.';
echo destacar
($texto, $nome);

function destacar($texto, $palavra, $tag = 'strong') {
    $palavra_destaque
= '<'.$tag.'>'.$palavra.'</'.$tag.'>';
   
return str_replace($palavra, $palavra_destaque, $texto);
}

0
24/02/2010 6:54pm
(~15 anos atrás)
Hugo Campos respondeu:
Dara rubens tudo certo, isso eu já fiz, soh que eu queria uma coisa mais precisa. Tipo eu tenho o Jose d Silva. E dentro de um texto eu tenho Jose da Silva. Eu queria marca o Jose da Silva que esta dentro do texto, usando o Jose d Silva como referencia.

0
24/02/2010 9:46pm
(~15 anos atrás)
Hugo, neste caso você quer uma coisa MENOS precisa. Afinal, a alternativa que passei pega o texto exato, e o que você quer é que tenha uma certa "tolerência".

Não sei pra que você quer isso, mas se é extremamente necessário, uma alternativa é usar a função similar_text. Ela avalia a semelhança entre duas strings e devolve na forma de porcentagem e a quantidade de caracteres iguais.

Veja a referência em:
http://br.php.net/manual/pt_BR/function.similar-text.php

Para montar o script, já é um pouco mais trabalhoso. Uma alternativa é essa abaixo, mas já adiando que podem ter muitos bugs, já que é um trabalho delicado sobre a string.

<?php

$nome
= 'Jose d Silva';
$texto
= 'Encontrei o Jose da Silva na rua e o Jose da Silva me chamou';

echo destacar
($texto, $nome, 90);
exit(0);

/**
 * Destaca uma palavra no texto de acordo com um grau de tolerancia
 * @param string $texto Texto completo
 * @param string $palavra Texto usado como base de busca
 * @param float $tolerancia Grau de tolerancia de similaridade
 * @param string $tag Nome da tag usada para destaque
 * @return string Texto substituido
 */

function destacar($texto, $palavra, $tolerancia = 90, $tag = 'strong') {
    $tamanho_palavra
= strlen($palavra);
    $tamanho_texto
= strlen($texto);

    $primeira_letra
= $palavra[0];
    $ultima_letra
= $palavra[$tamanho_palavra - 1];

    $texto_saida
= '';
    $pos
= 0;

   
// Achar primeira letra
   
for ($pos = 0; $pos < $tamanho_texto; $pos++) {

       
if ($texto[$pos] != $primeira_letra) {
            $texto_saida
.= $texto[$pos];
           
continue;
       
}

        $tamanho_substr
= 0;
       
// Achar ultima letra
       
for ($i = $pos + 1; $i < $tamanho_texto; $i++) {

           
// Achou ultima letra
           
if ($texto[$i] != $ultima_letra) {
               
continue;
           
}
            $tamanho
= $i - $pos + 1;

           
// Tamanho ainda menor que o tamanho da palavra
           
if ($tamanho < $tamanho_palavra) {
                $tamanho_substr
= $tamanho;

           
// Tamanho igual ao tamanho da palavra
           
} elseif ($tamanho == $tamanho_palavra) {
                $tamanho_substr
= $tamanho;
               
break;
           
// Tamanho maior que o tamanho da palavra
           
} else {

               
// Se detectou um tamanho menor que a palavra
               
if ($tamanho_substr) {

                   
// Obter tamanho mais proximo do tamanho da palavra ou o maior pedaco
                    $t_menor
= abs($tamanho_palavra - $tamanho_substr);
                    $t_maior
= abs($tamanho_palavra - $tamanho);
                    $tamanho_substr
= $t_menor < $t_maior ? $tamanho_substr : $tamanho;

               
// Se nao detectou, usar o tamanho encontrado
               
} else {
                    $tamanho_substr
= $tamanho;
               
}
               
break;
           
}
       
}
       
// Se achou a ultima letra
       
if ($tamanho_substr !== 0) {
            $substr
= substr($texto, $pos, $tamanho_substr);
       
} else {
            $substr
= substr($texto, $pos);
       
}

       
// Obter similaridade
        similar_text
($substr, $palavra, $porcentagem);

       
// Se a similaridade eh maior que a tolerancia
       
if ($porcentagem >= $tolerancia) {
            $texto_saida
.= '<'.$tag.'>'.$substr.'</'.$tag.'>';
            $pos
+= $tamanho_substr - 1;
       
} else {
            $texto_saida
.= $texto[$pos];
       
}
   
}
   
return $texto_saida;
}

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)