Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

BRG

[Resolvido] preg_replace - ER Simples

Recommended Posts

Olá pessoal.

 

tenho o seguinte código

$pal = "Fé";
$string = preg_replace("/(".$pal."?)/i","<span class='palavrasdabusca'>\\0</span>",strip_tags(stripslashes($rsBiblia->DESCRICAO)));

Ele funciona certo, porem ele grifa a palavra Fé, mais também a palavra Eusio. Eu só queria a palavra inteira, e não no meio das outras palavras.

 

Acho que tem que usar o \b(borda). Porem ja tentei de tudo que é jeito e nada...

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca a borda antes de abrir e de fechar o grupo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca a borda antes de abrir e de fechar o grupo.

$string = preg_replace("/\b(".$pal."?)\b/i","<span class='palavrasdabusca'>\\0</span>",strip_tags(stripslashes($rsBiblia->DESCRICAO)));

??? não funciono...rs

 

Não entendo de ER, mas se fizer assim não resolve?

$pal = ' Fé ';//colocar um espaço antes e um depois

Carlos Eduardo

Hum.. pode ser, mais não seria o correto né..rs

E ele vai grifar _Fé_

 

,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas é claro que não vai casar.

 

\b é o metacaractere de escape seguido da letra b, logo, um b literal

 

O certo é \\b. Acredite, eu mesmo já apanhei muito por causa disso :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim, exemplo:

$frase = "festaaaa fe em deus que ele e justo cafe cafe aaafeeee aafe feaaa aafeaa";
$pal = "fe";
$string = preg_replace("/([^ ]*".$pal."[^ ]*)/i","<span class='palavrasdabusca'>$1</span>",$frase);
echo $string;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas é claro que não vai casar.

 

\b é o metacaractere de escape seguido da letra b, logo, um b literal

 

O certo é \\b. Acredite, eu mesmo já apanhei muito por causa disso :P

Tranquilo, funcionou em partes....

E se eu tiver Fé, ele não vai grifar, pois do para a , não tem espaço. tem o lance do @, no caso tentei substitur o @pelo segundo \\b mais não rolou..rs

 

Estou tentando aprender essas ERs...

 

 

Tenta assim, exemplo:

$frase = "festaaaa fe em deus que ele e justo cafe cafe aaafeeee aafe feaaa aafeaa";
$pal = "fe";
$string = preg_replace("/([a-zA-Z0-9]*".$pal."[a-zA-Z0-9]*)/i","<span class='palavrasdabusca'>$1</span>",$frase);
echo $string;

Então rafa, mais eu não quero que ele grife Café nem Ca, apenas Fé separado, monossilaba e pode ter , (junto com virgula) Fé' ai sem problemas..

 

 

Duvida 2

Quando eu us a-zA-Z eu não preciso do /i né??

..

 

 

Edit

 

Tenta assim, exemplo:

$frase = "festaaaa fe em deus que ele e justo cafe cafe aaafeeee aafe feaaa aafeaa";
$pal = "fe";
$string = preg_replace("/([^ ]*".$pal."[^ ]*)/i","<span class='palavrasdabusca'>$1</span>",$frase);
echo $string;

Tentei... funcionou, para , Fé" etc..., porem ele ainda continua com Efésio, café...etc...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi errado entao. Mais ja esta resolvido ou nao?

Ainda não... com a ultima que postou deu quase certo.

 

$string = preg_replace("/([^ ]*".$pal."[^ ]*)/i","<span class='palavrasdabusca'>$1</span>",$frase);

Ele está grifando Fé, Fé", Fé'. o Que está correto.

Porem ele ainda está grifando Café, Efésio... o que não é correto. Então precisava tirar essa parte da ER

 

,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim pega so a palavra certa:

$frase = "festaaaa fe em deus que ele e justo cafe cafe aaafeeee aafe feaaa aafeaa";
$pal = "fe";
$string = preg_replace("/([ .,_@:\/\!\(\)-]".$pal."[ .,_@:\/\!\(\)-])/i"," <b>$1</b> ",$frase);
echo $string;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim pega so a palavra certa:

$frase = "festaaaa fe em deus que ele e justo cafe cafe aaafeeee aafe feaaa aafeaa";
$pal = "fe";
$string = preg_replace("/([ .,_@:\/\!\(\)-]".$pal."[ .,_@:\/\!\(\)-])/i"," <b>$1</b> ",$frase);
echo $string;

Então cara.. quase.. olha so a imagem:

Imagem Postada

 

Ela grifou _FÉ_ espaços e não grifou o fé" .

 

Aff.. que treta..

Cara.. eu não sou muito religioso.. hauah mais ja estou começando a rezar... ahuahauah

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim, testei e deu certo :

$var = preg_replace('/(\W)('.$palavra.')(\W)/i','\\1<b>\\2</b>\\3',$var);

Dúvida, leia aí : http://guia-er.sourceforge.net/aliens.html

 

[]'s

 

flws

Salve Fernando.

Funciono direitinho... porem tem como explicar passo a passo ai o que fez?? não entendi muito bem a parte do \\1<b>\\2</b>\\3.

 

Obrigado Rafael pela atenção tbm..

 

Mais uma duvida. tem como aplicar isso no LIKE do SQL?? (usando Mysql) ??

 

 

,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim, testei e deu certo :

$var = preg_replace('/(\W)('.$palavra.')(\W)/i','\\1<b>\\2</b>\\3',$var);

Dúvida, leia aí : http://guia-er.sourceforge.net/aliens.html

 

[]'s

 

flws

Salve Fernando.

Funciono direitinho... porem tem como explicar passo a passo ai o que fez?? não entendi muito bem a parte do \\1<b>\\2</b>\\3.

 

Obrigado Rafael pela atenção tbm..

 

Mais uma duvida. tem como aplicar isso no LIKE do SQL?? (usando Mysql) ??

 

 

,

 

Você viu a tabela do site passado?

 

O que ele fez foi, no segundo grupo buscar a palavra que você quer. Nos grupos 1 e 3 (\W), casar qualquer coisa que não seja uma palavra (dígitos, pontuação, espaços em branco e novas linhas).

O /i é modificador de "ignorãncia", para casar maiúsculas e minúsculas do mesmo jeito.

Depois da vírgula, no segundo argumento de preg_replace(), tem a substituição, negritando o termo.

 

Só atente para o uso de <b></b>. O certo, em XHTML é <strong></strong>

 

Já em MySQL é possível sim, através da cláusula REGEXP. Porém algumas modificações podem ser necessárias na sua ER.

 

Acredito que agora sim esteja de fato RESOLVIDO ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma coisa, use preg_quote() para escapar os possiveis metacaracteres ER na busca

Exemplo :

$palavra = preg_quote($palavra);

Se for usar pra busca em sintaxe SQL, não esqueça de adicionar barras invertidas, através de addslashes() ou mysql_real_escape_string() depois do uso do preg_quote().

 

@Imaggens Instrução bem detalhada XD http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

O sql dessa função:

$var = preg_replace('/(\W)('.$palavra.')(\W)/i','\\1<b>\\2</b>\\3',$var);

É esquivalente a isso?? está correto??

 

SELECT * FROM artigos WHERE id_secao = '1' AND descricao REGEXP '[^[:alnum:]_]".$PALAVRA."[^[:alnum:]_]' LIMIT 0 , 30

,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que você não precisaria substituir nada via query, então sim, é a mesma coisa.

 

Mas prefira os barra-letra ao invés das classes POSIX.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que você não precisaria substituir nada via query, então sim, é a mesma coisa.

 

Mas prefira os barra-letra ao invés das classes POSIX.

Então Imaggens, para usar o barra-letra ficaria como??

 

Eu tentei.. mais não consegui com o addslashes().

 

Edit:

Tem alguma desvantagem usando POSIX???

 

,

Compartilhar este post


Link para o post
Compartilhar em outros sites

O sql dessa função:

$var = preg_replace('/(\W)('.$palavra.')(\W)/i','\\1<b>\\2</b>\\3',$var);

É esquivalente a isso?? está correto??

 

SELECT * FROM artigos WHERE id_secao = '1' AND descricao REGEXP '[^[:alnum:]_]".$PALAVRA."[^[:alnum:]_]' LIMIT 0 , 30

,

Só mais um detalhe, adicionei o metacaracter - \A e \Z - começo do texto e fim, da forma anterior ele não casava palavras no começo e fim.. Ex : considere a busca como 'Teste'

  • Teste de palavra
  • palavra de Teste
As duas frase acima, não resultavam na pesquisa.

Finalizando, a modificação :

"SELECT * FROM artigos WHERE id_secao = '1' AND descricao REGEXP '([^[:alnum:]_]|\A)".$palavra."([^[:alnum:]_]|\Z)' LIMIT 0, 30"

 

Com barra-letra, ficaria identico ao que eu postei em php, mas que eu saiba o mySQL não tem suporte à algumas, \W não funfa, pelo menos o meu não tem. ^_^

 

Outra coisa importante, não se esqueça de antes de passar variaveis para REGEXP no mySQL, usar o preg_quote() para escapar os metacaracteres e depois mysql_real_escape_string() para escapar as barras invertidas criadas pelo preg_quote() anteriormente.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.