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