Jump to content
ivobarbosa

Ajuda highlight termos da pesquisa

Recommended Posts

ivobarbosa

Boa noite mestres do PHP, tenho aqui uma duvida, será que me podem ajudar?

Tenho a função que está em baixo para destacar as palavras da pesquisa, só que esta função apenas sublinha as palavras que existem mesmo na pesquisa, resumindo o que pretendia fazer era uma função que não diferencia-se as palavras com acentos ou cedilhas.

Por ex: se pesquisar "Amélia" ou "amelia" ou "Amelia", a função destacar na mesma a palavra.

Alguém sabe como resolver isto?Já tentei várias alternativas como o Regex e não consegui.

Grato a todos.

function highlight($texto,$palavra){
  return preg_replace("/($palavra)/is", "<u><strong>\\1</strong></u>", $texto);
}


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
pedrotuga

Não estou a ver nenhuma forma trivial de fazer isto, mas acredito que haja.

Uma solução possível é pegares na tua palavra e desdobrá-la nas possíveis palavras parecidas, por exemplo:

constipação

constipacão

constipacao

constipaçao

pões isso para dentro de um array e percorres o array chamando a função que escreveste ali acima para cada elemento.

Share this post


Link to post
Share on other sites
simonoop

Tens um exemplo funcional disso na man page do preg_replace. Cuidado com o charset.

function prepare_search_term($str,$delim='#') {
    $search = preg_quote($str,$delim);

    $search = preg_replace('/[aàáâãåäæ]/iu', '[aàáâãåäæ]', $search);
    $search = preg_replace('/[eèéêë]/iu', '[eèéêë]', $search);
    $search = preg_replace('/[iìíîï]/iu', '[iìíîï]', $search);
    $search = preg_replace('/[oòóôõöø]/iu', '[oòóôõöø]', $search);
    $search = preg_replace('/[uùúûü]/iu', '[uùúûü]', $search);
    // add more characters...

    return $search;
}

function highlight($searchtext, $text) {
    $search = prepare_search_term($searchtext);
    return preg_replace('#' . $search . '#iu', '<span style="background-color:red">$0</span>', $text);
}

$testtext = 'cafe cáfé càfè CAFE CÁFÉ CÀFÈ càfé cáfè CÀFÉ CÁFÈ';
echo highlight('cafe',$testtext) . '<br />';
echo highlight('cáfé',$testtext) . '<br />';
echo highlight('CAFE',$testtext) . '<br />';
echo highlight('CÀFÉ',$testtext) . '<br />';

Share this post


Link to post
Share on other sites
ruimcosta

Para fazer pesquisas em Mysql sem ligar aos acentos utilizo esta pérola que funciona 5*:

$filtro = $_POST['txtpesq'];

$sql = "SELECT * 
     FROM conteudos
     WHERE titulo REGEXP '".pesquisa($filtro)."' or
      conteudo REGEXP '".pesquisa($filtro)."'  ORDER BY dreg desc";

Qualquer coisa deste género deverá ser de qualquer forma validado.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
ivobarbosa

Para fazer pesquisas em Mysql sem ligar aos acentos utilizo esta pérola que funciona 5*:

$filtro = $_POST['txtpesq'];

$sql = "SELECT * 
     FROM conteudos
     WHERE titulo REGEXP '".pesquisa($filtro)."' or
      conteudo REGEXP '".pesquisa($filtro)."'  ORDER BY dreg desc";

Qualquer coisa deste género deverá ser de qualquer forma validado.

Com as pesquisas de mysql não tenho que me preocupar pois com a sintax like, obtenho sempre a palavra, mesmo escrevendo "amelia"; "Amelia"; "Amélia" ou "Amelia", o problema é mesmo no destacamento da palavra.

Obrigado pela sugestão.


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
ivobarbosa

Tens um exemplo funcional disso na man page do preg_replace. Cuidado com o charset.

function prepare_search_term($str,$delim='#') {
    $search = preg_quote($str,$delim);

    $search = preg_replace('/[aàáâãåäæ]/iu', '[aàáâãåäæ]', $search);
    $search = preg_replace('/[eèéêë]/iu', '[eèéêë]', $search);
    $search = preg_replace('/[iìíîï]/iu', '[iìíîï]', $search);
    $search = preg_replace('/[oòóôõöø]/iu', '[oòóôõöø]', $search);
    $search = preg_replace('/[uùúûü]/iu', '[uùúûü]', $search);
    // add more characters...

    return $search;
}

function highlight($searchtext, $text) {
    $search = prepare_search_term($searchtext);
    return preg_replace('#' . $search . '#iu', '<span style="background-color:red">$0</span>', $text);
}

$testtext = 'cafe cáfé càfè CAFE CÁFÉ CÀFÈ càfé cáfè CÀFÉ CÁFÈ';
echo highlight('cafe',$testtext) . '<br />';
echo highlight('cáfé',$testtext) . '<br />';
echo highlight('CAFE',$testtext) . '<br />';
echo highlight('CÀFÉ',$testtext) . '<br />';

Obrigado, vou testar e já digo se funcionou.


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
ivobarbosa

Tens um exemplo funcional disso na man page do preg_replace. Cuidado com o charset.

function prepare_search_term($str,$delim='#') {
    $search = preg_quote($str,$delim);

    $search = preg_replace('/[aàáâãåäæ]/iu', '[aàáâãåäæ]', $search);
    $search = preg_replace('/[eèéêë]/iu', '[eèéêë]', $search);
    $search = preg_replace('/[iìíîï]/iu', '[iìíîï]', $search);
    $search = preg_replace('/[oòóôõöø]/iu', '[oòóôõöø]', $search);
    $search = preg_replace('/[uùúûü]/iu', '[uùúûü]', $search);
    // add more characters...

    return $search;
}

function highlight($searchtext, $text) {
    $search = prepare_search_term($searchtext);
    return preg_replace('#' . $search . '#iu', '<span style="background-color:red">$0</span>', $text);
}

$testtext = 'cafe cáfé càfè CAFE CÁFÉ CÀFÈ càfé cáfè CÀFÉ CÁFÈ';
echo highlight('cafe',$testtext) . '<br />';
echo highlight('cáfé',$testtext) . '<br />';
echo highlight('CAFE',$testtext) . '<br />';
echo highlight('CÀFÉ',$testtext) . '<br />';

A mim isto apenas me funciona com o charset "UTF-8" se mudar para "iso-8859-1" que é o caso que eu tenho, já não funciona :P


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
brunoais

A mim isto apenas me funciona com o charset "UTF-8" se mudar para "iso-8859-1" que é o caso que eu tenho, já não funciona :P

Se usas caracteres que não fazem parte da norma que usas o que esperavas?

experimenta: http://php.net/manual/en/function.utf8-encode.php


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
brunoais

Provavelmente se passares tudo para utf8 fica a funcionar cmo deve ser.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
ivobarbosa

Provavelmente se passares tudo para utf8 fica a funcionar cmo deve ser.

Sim, não tenho duvidas que isso funcione, mas já tenho muitos campos na bd inseridos e iria ter que converter tudo, o que iria ser uma grande dor de cabeça.


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
ivobarbosa

Muda a base de dados para utf8. Não vejo vantagens em usar ISO, já que UTF apanha muito mais situações e ainda te dá mais possibilidades. Custa agora mas salva muitas dores de cabeça no futuro, acredita.

obrigado pela dica, mas por ja por ter tido com problemas com utf8 mudei para isso lol mas vou ver o que se pode fazer...

Muda a base de dados para utf8. Não vejo vantagens em usar ISO, já que UTF apanha muito mais situações e ainda te dá mais possibilidades. Custa agora mas salva muitas dores de cabeça no futuro, acredita.

Já agora numa bd MySql que utf8 usas?

"UTF8_BIN"; "UTF8_Unicode_ci" ou nem delas ou o "Utf8_swedish_ci"?

Obrigado


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
brunoais

Sim, não tenho duvidas que isso funcione, mas já tenho muitos campos na bd inseridos e iria ter que converter tudo, o que iria ser uma grande dor de cabeça.

Se usas Mysql é só exportar tudo usando o phpmyadmin, usas um editor de texto para substituir o charset para o que queres, soltar a inserir tudo na DB. Problema resolvido (em 5 min!).

obrigado pela dica, mas por ja por ter tido com problemas com utf8 mudei para isso lol mas vou ver o que se pode fazer...

Já agora numa bd MySql que utf8 usas?

"UTF8_BIN"; "UTF8_Unicode_ci" ou nem delas ou o "Utf8_swedish_ci"?

Obrigado

utf8_general_ci é o que eu uso pq acho ser o equilíbrio do mais versátil com o mais rápido.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
ivobarbosa

Se usas Mysql é só exportar tudo usando o phpmyadmin, usas um editor de texto para substituir o charset para o que queres, soltar a inserir tudo na DB. Problema resolvido (em 5 min!).

Quando tens mais de 500 registos na bd e tens que alterar a maior parte, já n é assim tão rápido como falas.


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
ivobarbosa

Ao colocar tudo em utf-8 páginas, e o colation da bd tambem em utf-8 e depois de alterar alguns registos, deparo-me que os acentos ficam deste genero "André Tiago Magalhães Ferreira" onde devia ser André Tiago Magalhães Ferreira, é normal acontecer isto?

Ou estarei a fazer alguma coisa mal?


Melhores Cumprimentos,

Ivo Barbosa

Share this post


Link to post
Share on other sites
yoda

Ao colocar tudo em utf-8 páginas, e o colation da bd tambem em utf-8 e depois de alterar alguns registos, deparo-me que os acentos ficam deste genero "André Tiago Magalhães Ferreira" onde devia ser André Tiago Magalhães Ferreira, é normal acontecer isto?

Ou estarei a fazer alguma coisa mal?

Qual o encode da página? Also, o encode de cada campo não muda quando mudas o encode de uma tabela / BD, tem de ser mudado à mão.

Share this post


Link to post
Share on other sites
ivobarbosa

Qual o encode da página? Also, o encode de cada campo não muda quando mudas o encode de uma tabela / BD, tem de ser mudado à mão.

da página é utf-8 sim eu sei, eu mudei o encode de cada campo, como tabela e base de dados, entretanto já consegui resolver a questão colocando  mysql_query("SET NAMES 'utf8'"); antes de cada  mysql_query();

Obrigado


Melhores Cumprimentos,

Ivo Barbosa

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

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.