Localizar palavra (não funciona para palavras com acentos no começo ou no final)

190 views
Skip to first unread message

Cássio Talle

unread,
May 17, 2011, 2:28:17 PM5/17/11
to expressoes...@googlegroups.com
Tenho um javascript para localizar palavras:

var reg       = new RegExp('\\b' + i +'\\b', 'g');

Mas ele não funciona quando a palavra começa ou termina com letras que possuem acento.

Alguém pode me ajudar?

Obrigado

Gustavo Dutra

unread,
May 17, 2011, 2:39:50 PM5/17/11
to expressoes...@googlegroups.com
Tente utilizar:

var reg = new RegExp("\\b[A-Za-zÀ-Úà-ú]+\\b", 'g');

Att,
Gustavo Dutra -
www.gustavodutra.com


2011/5/17 Cássio Talle <cassio...@gmail.com>
--
Você está recebendo esta mensagem porque se inscreveu no grupo "Expressões regulares" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para expressoes...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para expressoes-regul...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/expressoes-regulares?hl=pt-BR.

Cássio Talle

unread,
May 17, 2011, 2:57:51 PM5/17/11
to expressoes...@googlegroups.com
Olá Gustavo.

Acho que eu não expliquei bem o meu problema..

Eu tenho um palavra em uma variável e eu tenho que localizá-las em um texto.
Ex;

var i = 'você';


var reg       = new RegExp('\\b' + i +'\\b', 'g');

então eu faço uma concatenação para encontrar para gerar a regra para localizar a palavra que na prática ficaria assim:

\bvocê\b

Porém que quando a palavra começa ou termina com letras acentuadas a busca não funciona.

Obrigado.

Daniel Wermann

unread,
May 17, 2011, 11:12:20 PM5/17/11
to expressoes...@googlegroups.com
Olá Cássio

Veja as maneiras que construi os testes aqui:

<html>
<body>
<div id="texto">
Acho que você está com problemas.
</div>
<script type="text/javascript">
var i = "você";
var texto = document.getElementById("texto").innerHTML;
var reg = new RegExp(i, 'gi');
alert(reg.exec(texto));
alert(texto.match(/você/gi));
</script>
</body>
</html>

Teste aí e veja se é isso que você precisa.

Qualquer coisa, seguem referências:

http://www.w3schools.com/jsref/jsref_obj_regexp.asp
http://regex.larsolavtorvik.com/

Abraço.

2011/5/17 Cássio Talle <cassio...@gmail.com>


Obrigado.

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Expressões regulares" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para expressoes...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para expressoes-regul...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/expressoes-regulares?hl=pt-BR.



--
Atenciosamente,

Daniel Airton Wermann
Desenvolvedor de Sistemas para Internet

Felipe Pena

unread,
May 18, 2011, 6:57:28 AM5/18/11
to expressoes...@googlegroups.com
Olá,

Isso é esperado. Por quê o \b tem que estar antes ou depois de caracteres reconhecidos como palavra. O que você pode fazer, é usar um positivo lookahead checando se o que vem após é algum caractere que não é considerado uma palavra ou o final da string.

Exemplo:
/\bvocê(?=\W|$)/)

Vale lembrar que \W = [^a-zA-Z0-9_]

--
Regards,
Felipe Pena

Felipe Pena

unread,
May 18, 2011, 6:58:36 AM5/18/11
to expressoes...@googlegroups.com
Ops, ficou um parênteses ai. :)

/\bvocê(?=\W|$)/

--
Regards,
Felipe Pena

Cássio Talle

unread,
May 18, 2011, 11:25:24 AM5/18/11
to expressoes...@googlegroups.com
Olá Felipe a sua dica me ajudou muito, agora está funcionando perfeitamente para quase todos os casos porém para os casos em que o acento ocorre na primeira letra da palavra, por exemplo índio, ele não funciona

Tentei aplicar uma regra pareciada a que você aplicou para o final no inínio ficou assim

var i = 'índio'
var reg       = new RegExp('(?=\\W|^|\\b)'+ i +'(?=\\W|$)', 'g');

Dessa funciona, porém ele passa a lozalizar também o se o termo estiver contido em uma palavra, por exemplo

"palavraíndio"

Acho que só falta acertar isso pra funcionar perfeitamente.

Felipe Pena

unread,
May 18, 2011, 12:46:00 PM5/18/11
to expressoes...@googlegroups.com
Neste caso você não tem saída não... Não dá pra usar o mesmo recurso que usei para o caso do final... Por que o JavaScript não suporta lookbehind.
Em uma outra engine de regex você poderia até usar: (?<=\W|^), mas não no JavaScript.

Você só precisa checar se a palavra existe no texto? Se for o caso, basta você casar o possivel caractere que vier antes e depois da palavra que você procura...
/(?:^|\W)ônibus(?:\W|$)/

--
Regards,
Felipe Pena

Cássio Talle

unread,
May 18, 2011, 1:35:29 PM5/18/11
to expressoes...@googlegroups.com
Entendi, para o meu caso o roblema que eu estou tentando resolver é o seguinte.

Eu preciso transformar determinadas palavras de um texto em links usando javascript, então todas as ocorrências destas palavras serão substituídas por links. Entretanto o link só pode ser aplicado se a palavra do texto for exatamente igual a palavra da lista.

o código completo é o seguinte

<script type="text/javascript">
            (function($){
                $.fn.loadLinks = function(termo) {
                    for (i in termo) {
                        var conteudo = $(this).html();
                        var linkStart = '<a href="' + termo[i] + '" target="_blank">', linkEnd = '</a>';

                        var reg       = new RegExp('(?=\\W|^|\\b)'+ i +'(?=\\W|$)', 'g');
                        conteudo       = conteudo.replace(reg, linkStart + i + linkEnd);
                        $(this).html(conteudo);
                    }
                }
            })(jQuery);
           
            lista = {
                'ônibus' : 'http://www.texto.com',
                'terra' : 'http://www.gogle.com.br',
                'você'   : 'http://www.php.net',
                'minha casa' : 'http://www.minhacasa.com'
            }
           
            $('#texto').loadLinks(lista);
        </script>

com o RegExp('(?=\\W|^|\\b)'+ i +'(?=\\W|$)', 'g'); pelos meus testes está funcionando para todas as situações com exceção do caso, onde se a palavra for iniciada por uma letra com acento e se ela fizer parte de uma palavra um link é gerado pra ela...
por exemplo:

"Um ônibus e um microônibus partem às 7"

sendo que o o correto era ficar assim

"Um ônibus e um microônibus partem às 7"

Obrigado.
Reply all
Reply to author
Forward
0 new messages