Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] ¿cómo hago filtro de palabras prohibidas + puntuación?

Estas en el tema de ¿cómo hago filtro de palabras prohibidas + puntuación? en el foro de PHP en Foros del Web. Hola, ¿cómo puedo hacer para buscar determinadas palabras (sexo, porno, viagra etc) en un texto y que me diga cuantas veces se repiten dichas palabras ...
  #1 (permalink)  
Antiguo 13/11/2014, 11:15
Axo
 
Fecha de Ingreso: abril-2003
Ubicación: Virtual
Mensajes: 953
Antigüedad: 21 años, 7 meses
Puntos: 7
¿cómo hago filtro de palabras prohibidas + puntuación?

Hola,

¿cómo puedo hacer para buscar determinadas palabras (sexo, porno, viagra etc) en un texto y que me diga cuantas veces se repiten dichas palabras con el fin de esas repeticiones sumarlas para dar una puntuación y anular esa publicación directamente?
  #2 (permalink)  
Antiguo 13/11/2014, 11:34
Axo
 
Fecha de Ingreso: abril-2003
Ubicación: Virtual
Mensajes: 953
Antigüedad: 21 años, 7 meses
Puntos: 7
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

Código PHP:
Ver original
  1. function autoSpam($txt){//Funcion detectadora de insultos
  2. $noPermitidas = array('idiota','loca','viagra');//Array que contiene los insultos a detectar
  3.  
  4. foreach ($noPermitidas as $spam){//Pasamos el array a una variable
  5.  
  6.     if(preg_match("/$spam/i",$txt)){/*Usamos expreciones regulares
  7.     para comprobar si en el texto existe la palabra. Tambien uso el modificador i para que no diferencia entre mayuscula y minuscula*/
  8.     $cuenta++; // Contamos las palabras
  9.     }}
  10. return $cuenta;//Devuelve veces repetidas
  11. }//Fin de la funcion
  12.  
  13. $texto ="la loCa del bosque era muy loca y entonces enloquecio muy LOCA mente. Locura";
  14.  
  15. echo autoSpam($texto);

asi es como voy, pero me da como resultado 1 y debería dar 3
  #3 (permalink)  
Antiguo 13/11/2014, 11:34
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 10 años, 4 meses
Puntos: 44
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

Usando la función substr_count() por ejemplo:

Código PHP:
$text 'Detectar todos los hola de este texto. hola';
$cant substr_count($text'hola'); 

echo 
$cant
  #4 (permalink)  
Antiguo 13/11/2014, 11:37
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 10 años, 4 meses
Puntos: 44
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

Probá así:

Código PHP:
function autoSpam($txt){//Funcion detectadora de insultos
$cuenta 0;
$txt explode(" "$txt);
 
$noPermitidas = array('idiota','loca','viagra');//Array que contiene los insultos a detectar
 
foreach ($txt as $word){//Pasamos el array a una variable
    
foreach ($noPermitidas as $spam) {
        if(
preg_match("/$spam/i",$word)){/*Usamos expreciones regulares
            para comprobar si en el texto existe la palabra. Tambien uso el modificador i para que no diferencia entre mayuscula y minuscula*/
            
$cuenta++; // Contamos las palabras
        
}
    }
}
return 
$cuenta;//Devuelve veces repetidas
}//Fin de la funcion
 
$texto ="la loCa del bosque era muy loca y entonces enloquecio muy LOCA mente. Locura";
 
echo 
autoSpam($texto); 

Última edición por GeekGirl; 13/11/2014 a las 11:45
  #5 (permalink)  
Antiguo 13/11/2014, 11:46
Axo
 
Fecha de Ingreso: abril-2003
Ubicación: Virtual
Mensajes: 953
Antigüedad: 21 años, 7 meses
Puntos: 7
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

Gracias !! Ahora sí :D
  #6 (permalink)  
Antiguo 13/11/2014, 14:02
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

Otra manera, más corta y eficiente (aunque creo que puede ser aún más eficiente):

Código PHP:
Ver original
  1. function contar($texto){
  2.     $array = array_filter(preg_split('/[\s\.\,]+/s', strtolower($texto)), function($palabra){
  3.         if (in_array($palabra, ['loca', 'idiota', 'viagra'])) return $palabra;
  4.     });
  5.     foreach (array_count_values($array) as $k => $v) echo $k . ': ' . $v . '<br />';
  6. }
  7. contar('la loCa del bosque era muy loca y entonces enloquecio muy LOCA mente. Locura');
  8. contar('La idiota estuvo insistiendo por lo iDioTa que es. Además, es una loca y su marido consume vIaGRa.');

Lo anterior devuelve lo siguiente:

Código HTML:
Ver original
  1. //De la primera cadena
  2. loca: 3
  3.  
  4. //De la segunda cadena
  5. idiota: 2
  6. loca: 1
  7. viagra: 1

Lo que hace la función es lo siguiente. Primero, convierte el texto a minúsculas y separa las palabras a partir de los espacios en blanco, comas y puntos que encuentre (puedes añadir más caracteres especiales). Luego, del array resultante, tomo a las palabras que coincidan con las que estamos buscando y, finalmente, formo un array en el que los índices serán las palabras encontradas y los valores, la cantidad de repeticiones de cada una de ellas, imprimiendo así dichos valores.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 19/11/2014, 09:59
Axo
 
Fecha de Ingreso: abril-2003
Ubicación: Virtual
Mensajes: 953
Antigüedad: 21 años, 7 meses
Puntos: 7
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

Cita:
Iniciado por Alexis88 Ver Mensaje
Otra manera, más corta y eficiente (aunque creo que puede ser aún más eficiente):

Código PHP:
Ver original
  1. function contar($texto){
  2.     $array = array_filter(preg_split('/[\s\.\,]+/s', strtolower($texto)), function($palabra){
  3.         if (in_array($palabra, ['loca', 'idiota', 'viagra'])) return $palabra;
  4.     });
  5.     foreach (array_count_values($array) as $k => $v) echo $k . ': ' . $v . '<br />';
  6. }
  7. contar('la loCa del bosque era muy loca y entonces enloquecio muy LOCA mente. Locura');
  8. contar('La idiota estuvo insistiendo por lo iDioTa que es. Además, es una loca y su marido consume vIaGRa.');

Lo anterior devuelve lo siguiente:

Código HTML:
Ver original
  1. //De la primera cadena
  2. loca: 3
  3.  
  4. //De la segunda cadena
  5. idiota: 2
  6. loca: 1
  7. viagra: 1

Lo que hace la función es lo siguiente. Primero, convierte el texto a minúsculas y separa las palabras a partir de los espacios en blanco, comas y puntos que encuentre (puedes añadir más caracteres especiales). Luego, del array resultante, tomo a las palabras que coincidan con las que estamos buscando y, finalmente, formo un array en el que los índices serán las palabras encontradas y los valores, la cantidad de repeticiones de cada una de ellas, imprimiendo así dichos valores.

Saludos
Hola, la he probado y me da error. Estoy viendo a ver si consigo dar con el pero no hay forma.
  #8 (permalink)  
Antiguo 19/11/2014, 11:43
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 10 años, 4 meses
Puntos: 44
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

Te falla porque hay un error de sintaxis en el código. Está mal definido el array. Proba así:

Código PHP:
<?php
function contar($texto){
    
$array array_filter(preg_split('/[\s\.\,]+/s'strtolower($texto)), function($palabra){
        if (
in_array($palabra, array('loca''idiota''viagra'))) return $palabra;
    });
    foreach (
array_count_values($array) as $k => $v) echo $k ': ' $v '<br />';
}
contar('la loCa del bosque era muy loca y entonces enloquecio muy LOCA mente. Locura');
contar('La idiota estuvo insistiendo por lo iDioTa que es. Además, es una loca y su marido consume vIaGRa.');
?>
Igualmente no veo necesidad de seguir posteando código en un tema que ya fue marcado como solucionado Alexis88. El preguntó por qué su función no anaba y se le respondió. Lo de optimizar 10 líneas de código es cosa de cada uno :P Saludos
  #9 (permalink)  
Antiguo 19/11/2014, 12:15
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

No hay ningún error en la sintaxis del código. Lo que probablemente sucede es que la versión de PHP que utiliza Axo, es menor que la 5.4, en donde el uso de funciones lambda ya ha sido implementado y se pueden construir arrays con corchetes. Si quieres que funcione en versiones antiguas, puedes hacerlo así:

Código PHP:
Ver original
  1. function lambda($palabra){
  2.     if (in_array($palabra, array('loca', 'idiota', 'viagra'))) return $palabra;
  3. }
  4. function contar($texto){
  5.     $array = array_filter(preg_split('/[\s\.\,]+/s', strtolower($texto)), 'lambda');
  6.     foreach (array_count_values($array) as $k => $v) echo $k . ': ' . $v . '<br />';
  7. }
  8. contar('la loCa del bosque era muy loca y entonces enloquecio muy LOCA mente. Locura');
  9. contar('La idiota estuvo insistiendo por lo iDioTa que es. Además, es una loca y su marido consume vIaGRa.');

Aquí puedes ver cómo funciona con la función lambda y arrays construidos con corchetes y con una función nombrada y el constructor array().

Y respondiendo a lo que dice GeekGirl, cuando publiqué mi respuesta, el tema aún no había sido marcado como solucionado, pero aunque lo haya estado, no tiene absolutamente nada de malo el aportar con otra solución, de hecho, debes de saber que, en la programación, existen diversas formas de resolver un problema; lo que hice fue mostrar una alternativa más. Además, la optimización no va precisamente por el lado de la cantidad de líneas de código sino por el tiempo tomado en la obtención del resultado y, por ende, la cantidad de recursos utilizados. Tu solución funciona bien, pero no es la más óptima y, como dije, también podría optimizarse aún más la que propuse.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 19/11/2014 a las 18:23 Razón: Fe de erratas
  #10 (permalink)  
Antiguo 20/11/2014, 07:56
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 10 años, 4 meses
Puntos: 44
Respuesta: ¿cómo hago filtro de palabras prohibidas + puntuación?

El código no lo desarrollé yo. Simplemente agregué lo que faltaba para que su función funcione, valga la redundancia.

Etiquetas: palabras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:09.