← Tutoriais

[PHP] Filtrar palavras impróprias.

Lida 12413 vezes

Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Boas!
A princípio criei este pequeno código essencialmente para impedir certos utilizadores de registarem nicks menos próprios, mas rápidamente o adaptei tambem para filtrar certas palavras em posts.
 
Devo tambem referir que já tinha experimentado outros códigos que existem por aí e que supostamente teriam o mesmo efeito, mas a verdade é que nenhum funcionou da maneira que pretendia, já para não falar dos que nem sequer funcionavam. LoL

Mas vamos ao que importa.

Portanto vamos precisar de 2 ficheiros, um de texto a que podemos nomear de
lista.txt
e o do código propriamente dito, por exemplo
teste.php

Atenção que neste caso ambos os ficheiros tem de estar no mesmo directório!

No nosso ficheiro lista.txt vamos escrever o seguinte e exactamente como aqui está:
    teste|
    palavrão|
    www|
    lista|
    [/list]
    Esta será portanto a lista de palavras que queremos remover.

    Vamos então ao código:

    Citar
    <?php

    $frase = "Aqui está um palavrão que queremos remover e vamos tambem retirar as iniciais www.";   //A frase que vamos filtrar.

    $dados = file("lista.txt");  //Inserimos a lista numa array

    $c = count($dados); //Contamos o número de linhas

    for ($i = $c-1; $i>= 0; $i--)  //Com a funçao 'for' vamos percorrer a nossa lista
      {
          $verificar = @explode("|",$dados[$i]); //Neste exemplo utilizo o separador "|", mas tambem podem utilizar a função  trim(), fica ao critério de cada um.

       if (eregi("($verificar[0])", "".trim($frase)."")) //Se na frase existirem palavras impróprias...
       
     $frase = eregi_replace("$verificar[0]", "[censurado]", $frase); //Vamos substituír essas palavras pela palavra 'censurado'. Obviamente, a palavra de substituição será uma a vossa escolha.
      }
     
     
      //Por fim temos a frase filtrada e pronta a ser exibida.
      echo $frase;
     
     ?>



    Neste exemplo o resultado será este:
    Aqui está um [censurado] que queremos remover e vamos tambem retirar as iniciais [censurado].

    E pronto, temos um filtro de palavras, basta adicionar as palavras que queremos remover no ficheiro de texto.

    Espero que seja útil a alguem.  :wink:

    Nota: Existem várias funções para ler ficheiros mas penso que com esta forma o código corre mais rápido.
    Offline

    cenourinha 
    Elite
    Mensagens 4094 Gostos 21
    Troféus totais: 34
    Trófeus: (Ver todos)
    Mobile User Apple User Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4

    Parece-me bem, apenas não gosto de ficheiros txt...

    lol
    Offline

    Nazgulled 
    Membro
    Mensagens 552 Gostos 0
    Troféus totais: 29
    Trófeus: (Ver todos)
    Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

    opta por xml, fica + moderno =D
    Offline

    =IceBurn= 
    Membro
    Mensagens 897 Gostos 3
    Feedback +3

    Troféus totais: 32
    Trófeus: (Ver todos)
    Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

    Citação de: "cenourinha"
    Parece-me bem, apenas não gosto de ficheiros txt...

    lol

    Porquê?
    Na minha opinião uma base de dados não se justifica para uma função como esta.
    Alem disso podes sempre proteger o ficheiro de texto com .htaccess

    Código: [Seleccione]
    <Files .htaccess>
    order deny,allow
    deny from all
    </Files>
    <Files "*.txt">
    order deny,allow
    deny from all
    </Files>
    Offline

    OFFICER 
    Membro
    Mensagens 2076 Gostos 0
    Troféus totais: 29
    Trófeus: (Ver todos)
    Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

    Sou da mesma opinião do cenourinha, antes usar xml ou mysql ;)

    Não tem nada a ver com o ser mais antigo nem nada, mas não gosto de dados em ficheiros .txt porque além de não ser nada seguro (mesmo com regra .htaccess), epá não é igual a ter numa BD por exemplo.

    Mas gostei do tutorial e até vou utilizar o mesmo, excepto os .txt lolol  :lol:
    Offline

    kingless 
    Membro
    Mensagens 857 Gostos 0
    Troféus totais: 27
    Trófeus: (Ver todos)
    Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

    O =IceBurn= tem razão não vale a pena utilizar mysql ou xml para uma função tão simples como essa, se fosse uma função maior que tivesse mais valores que precisassem ser guardados ai utilizava-se mysql, utilizar mysql neste caso é só ocupar mais bytes na mysql. Mas cada um utiliza o que quiser :wink:
    Offline

    =IceBurn= 
    Membro
    Mensagens 897 Gostos 3
    Feedback +3

    Troféus totais: 32
    Trófeus: (Ver todos)
    Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

    O ficheiro de texto serve para formar a array.
    Ou seja, uma coisa tipo
     
    $dados = array("palavrão","www");

    funcionaria exactamente da mesma forma.
    Se fosse para guardar dados importantes ainda compreendia que não era a melhor solução, mas pronto fica a ideia base, agora cada um adapta como achar melhor.  :wink:
    Offline

    OFFICER 
    Membro
    Mensagens 2076 Gostos 0
    Troféus totais: 29
    Trófeus: (Ver todos)
    Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

    Claro! Mas por exemplo, imagina que a pessoa quer mesmo chamar a tal palavra como por exemplo cabra.. e tu tens lá cabra, então ele pode ver que não consegue por cabra mas que consegue por CaBra e etc..
    Offline

    kingless 
    Membro
    Mensagens 857 Gostos 0
    Troféus totais: 27
    Trófeus: (Ver todos)
    Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

    Citação de: "OFFICER"
    Claro! Mas por exemplo, imagina que a pessoa quer mesmo chamar a tal palavra como por exemplo cabra.. e tu tens lá cabra, então ele pode ver que não consegue por cabra mas que consegue por CaBra e etc..


    @OFFICER podias pelo menos testar o código antes de dares uma resposta...

    Código: [Seleccione]

    <?php
    $filtrar 
    = array&#40; 'cabra', 'wwww' &#41;;
    $palavra "Ela é uma caBra";
    echo 
    eregi_replace&#40; $filtrar[0&#93;, '*******', $palavra &#41;;
    ?>



    O  i  do   eregi_replace significa "case insensitive" isso quer dizer que não existe diferença entre maiusculas e minusculas.
    Offline

    OFFICER 
    Membro
    Mensagens 2076 Gostos 0
    Troféus totais: 29
    Trófeus: (Ver todos)
    Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

    Como dei o exemplo de Cabra posso dar um exemplo de c*r*l*o que pode ser substiuido por crl entre outros..

    Ficar o .txt visivel ou possivelmente visivel (já com protecção) não acho solução, mas cada um tem a sua maneira de ver as coisas
    Offline

    kingless 
    Membro
    Mensagens 857 Gostos 0
    Troféus totais: 27
    Trófeus: (Ver todos)
    Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

    É muito difícil conseguir filtrar palavras como p*l*v*a,  não é por utilizares mysql que vais conseguir impedir o usuário de postar palavras como  p*l*v*a... se o .txt tem protecção não existe razão para utilizar mysql, mesmo que não tivesse protecção pode-se sempre trocar o nome do ficheiro.txt para um qualquer como por exemplo  "j2kd0n2nsw9.txt" e assim só tu é que sabes o nome do ficheiro onde estão as palavras a serem filtradas e já ninguém consegue ver :P  :wink:
    Offline

    =IceBurn= 
    Membro
    Mensagens 897 Gostos 3
    Feedback +3

    Troféus totais: 32
    Trófeus: (Ver todos)
    Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

    Citação de: "kingless"
    .... pode-se sempre trocar o nome do ficheiro.txt para um qualquer como por exemplo  "j2kd0n2nsw9.txt" e assim só tu é que sabes o nome do ficheiro onde estão as palavras a serem filtradas e já ninguém consegue ver :P  :wink:


    Vou mais longe ainda...
    até podemos chamar o ficheiro de 'aaa' ou qualquer coisa do género, ou seja,  o ficheiro nem sequer precisa de ter extensão!  :D
    Na altura de o proteger com o htaccess em vez de
    <files "*.txt">
    basta pôr
    <files "aaa">

     :wink:
    Offline

    terra 
    Membro
    Mensagens 1 Gostos 0
    Troféus totais: 14
    Trófeus: (Ver todos)
    Super Combination Combination Level 3 Level 2 Level 1 First Post Karma Seventh year Anniversary Sixth year Anniversary Fifth year Anniversary

    Ola todos,

    sei que o topico é antigo mas...

    como fazer para filtar e-mail com esse codigo?


    grato

    terra