Duda en Php como identificar un texto?

Iniciado por free-articles, 17 Febrero 2013, 02:41 AM

0 Miembros y 1 Visitante están viendo este tema.

free-articles

Imagina que tengo un formulario o una casilla donde el usuario pone su nombre.


Imagina que ese usuario no pone su nombbre sino que pone idiota.


Como puedo saber si el user escribe "idiota"? Mi intención es algo asi como
que si pone idiota en la casilla le salga un mensaje algo asi: Por favor no insulte, introdúzca su usuario..

Alguien sabe como hacerlo? Gracias
hola

free-articles

#1
if { $user== "idiota" }

{ echo "ingrese user yno insulte", GRACIAS};




eso valdria? le quiero decir a php:

SI USUARIO CONTIENE INSULTO HAZ ESTO SINO LO OTRO

PERO TENGO UN PROBLEMA.. SI EL USUARIO ESCRIBE  EN LA CASILLA ALGO COMO:

ERES IDIOTA JJAJA


YA NO RECONOCERIA LA VARIABLE PORQUE
VA ENTRE PALABRAS.. ¿COMO IDENTIFICAR UNA PALABRA AUNQUE VAYA DENTRO
DE UNA FRASE?
hola

#!drvy

Para empezar, hacer un if por cada palabra es un tanto costoso.

Puedes tener un array lleno de palabras del tipo lista negra.

Código (php) [Seleccionar]
$lista_negra = array('idiota','jilipichi','tonto','eres gilipollas o peinas setas?');

Luego lo podrías comprobar con in_array();

Código (php) [Seleccionar]
if(in_array($user,$lista_negra)){
  echo 'Menos insultos y mas peinar setas';
}


Lo segundo que comentas ya se complica. Podrías utilizar funciones como stristr() que buscaran la palabra en un string..
Código (php) [Seleccionar]
if(stristr('idiota',$user)){
 echo 'Menos insultos y mas peinar setas';
}


El problema, es que si meto culo en la lista negra, con esa función, si pongo de usuario Crepusculo, la detectara como insulto. Ahí ya, tendrías que construir un regex que aisle las palabras entre espacios y otras cosas y se vuelve bastante complicado.

Por eso, la mayoría prefieren tener una lista negra cortita con cosas básicas y para lo demás poner el "Reportar usuario" para que se le pueda reportar en caso de un nick no adecuado.

Saludos

free-articles

#3
Excelente

CitarEl problema, es que si meto culo en la lista negra, con esa función, si pongo de usuario Crepusculo, la detectara como insulto


Muy interesante porque seria más dificil jugármela
pero una pregunta,

Hay alguna manera de que aunque el tio ponga:

lo que sea idiota

Lo reconózca?


Si lo ves complicado se me ocurrre minimizar las posibilidades de que el usuariio
ponga palabras separadas por espacios..
pero igualmente si pone todo junto holaidiotatelacomes


Pues me la como..

Muchas gracias por tu ayuda
hola

jdc

Toca usar la creatividad, por ejemplo no es lo mismo "insulto" que " insulto "

SCM

#5
Podrías meter en un array palabras que son un insulto aunque vayan junto a otras palabras, por ejemplo eresunidiota, idiota no es lo mismo que crepúsculo, que al final de una palabra forma otra verdaderamente.

Así que se me ocurre hacer un array para el primer tipo de insultos y recorrerlo usando stristr. Para palabras como culo, recorrer usando un explode que separe por espacios e identifique solamente la palabra malsonante.

Para evitar que use palabras como eresunculo se me acaba de ocurrir también otra cosa. Parsear un diccionario web en linea, como puede ser http://www.rae.es/rae.html
Si la palabra no existe, como es el caso de eresunculo, y stristr te devuelve que culo está en tu string de insultos, que deniegue la palabra, pues realmente no tiene ningún significado.. Y luego con un simple if que vea si la palabra es culo a secas y que la deniegue igualmente. Lo que pasa es que para parsear el diccionario, o bien haces muy bien el script, o se va a demorar un poco..

Un saludo.

#!drvy

Parsear un diccionario esta bien.. el problema es que añade mucha carga y tiempo de ejecucion al script..

Por otro lado:
Porque crees que ningún foro "conocido" trae este tipo de filtros ? Simplemente no es rentable. Ya te digo, manten una lista negra básica (con lo mas común) y dale la posibilidad a otros a reportar el usuario.

Saludos

SCM

Una pregunta sobre parsear, que serviría para este tema drvy. Si añades x puntos, por ejemplo, si la palabra empieza por C, no se podría hacer que solamente parsee una parte del diccionario, palabras que empiecen por C?

Me refiero:
Punto A -
Palabras por A
Punto B -
Palabras por B
Punto C -
Palabras por C
Punto D -
Palabras por D

Si la palabra empieza por C, ejecutarlo que lea el contenido entre el punto C y el punto D, obviando todo lo demás.
Esto es posible o la función tendría que parsear primero toda la web? Porque de ser así se le podrían aplicar ciertos filtros que haría el tiempo de respuesta mucho menor. Aunque no he practicado mucho en este tema, por lo que no sé si de todos modos eso tardaría también.

Saludos.

#!drvy

#8
No la verdad es que no hace falta ir tan lejos. Puesto que un diccionario normalmente es una base de datos, solo hace falta hacer una búsqueda de la palabra exacta. Lo mismo pasa con la RAE, se puede hacer un script que busque la palabra y devuelva los resultados.

Código (php) [Seleccionar]
<?php

function buscar_rae($palabra=NULL){
  if(empty(
$palabra)){return false;}
  
// Obtenemos la respuesta JSON de una API para la RAE.
  
$contenido json_decode(utf8_encode(file_get_contents('http://rae-quel.appspot.com/json?query='.$palabra)));
  
// Si devuelve [] es que no ha encontrado la palabra.
  
if($contenido=='[]' || $contenido===false){return false;} else {return $contenido;}
}

$palabra 'idiota';
$busqueda buscar_rae($palabra);

if(!
$busqueda){
  echo 
'La palabra no existe';
} else {
  echo 
'La palabra existe';
  echo 
'<br /><pre>';
  
print_r($busqueda);
}

?>


En este caso devolvería algo así:

Código (plain) [Seleccionar]
La palabra existe

Array
(
   [0] => Que padece de idiocia.U. t. c. s.
   [1] => Engreído sin fundamento para ello.U. t. c. s.
   [2] => Tonto, corto de entendimiento.
   [3] => Que carece de toda instrucción.
)


El problema como ya he mencionado es que añade un tiempo de ejecución bastante alto... y no es viable en paginas de mucho trafico donde lo tienes que comprobar cada 2x3 (ej: Los usuarios nuevos en el mes enero de este foro han sido 2259)..




Edit: He estado jugando un poco xD
Código (php) [Seleccionar]
<?php
function detectar_nick($nick=NULL,$lista=NULL,$rae=false){
// Si el nick o la lista estan vacios o si lista no es array.. false.
if(empty($nick) OR empty($lista) OR !is_array($lista)){return false;}
$resultado = array(); // No lo tengas en cuenta.. es para el STRICT
// Eliminar acentos.
$acento = array('é'.'á','ó','ú','í','É','Á','Ó','Ú','Í');
$nacento = array('e','a','o','u','i','E','A','O','U','I');
$nick strtolower(str_replace($acento,$nacento,$nick));

// Buscar en la RAE?
if($rae!==false){
$url 'http://rae-quel.appspot.com/json?query='.urlencode($nick);
$contenido json_decode(utf8_encode(file_get_contents($url)));
// Si la palabra no existe, devolver false.. si existe devolver true.
if(strlen(implode($contenido)) < 4|| $contenido===false){$resultado['rae']=false;}
else {$resultado['rae']=true;}
}


// Por cada palabra en la lista negra.
foreach($lista as $item){
// Busqueda directa.
if($item==$nick){$resultado['directo']=true;}else{$resultado['directo']=false;}
// Plural Directo
if($item.'s'==$nick){$resultado['directo_plural']=true;}else{$resultado['directo_plural']=false;}
// Preciso con stristr
if(stristr($nick,$item)){$resultado['precisa']=true;}else{$resultado['precisa']=false;}
// Plural preciso
if(stristr($nick,$item.'s')){$resultado['precisa_plural']=true;}else{$resultado['precisa_plural']=false;}
// Separamos la palabra si contiene espacios.
foreach(explode(' ',$nick) as $palabra){
// Directo
if($palabra==$item){$resultado['directo_separado']=true;}else{$resultado['directo_separado']=false;}
// Plural
if($palabra==$item.'s'){$resultado['directo_separado_plural']=true;}
else{$resultado['directo_separado_plural']=false;}
// Si coincide alguno, rompemos foreach
if($resultado['directo_separado']===true || $resultado['directo_separado_plural']===true) {break;}
}

// Si hay coincidencia con anteriores = romper foreach
if($resultado['directo_plural']===true ||
   $resultado['precisa']===true ||
   $resultado['precisa_plural']===true ||
   $resultado['directo_separado']===true ||
   $resultado['directo_separado_plural']){
break;
}
}
// Devolver en forma de array.
return $resultado;
}


$palabra 'minombre';
$lista_negra = array('idiota','puto','negro','lechuga con tomate','culo');
$comprobacion detectar_nick($palabra,$lista_negra,true);

foreach(
$comprobacion as $n=>$v){
if($v===true){echo '<font color="red">'.$n.' DETECTADO</font><br />';}
else{echo '<font color="green">'.$n.' LIMPIO</font><br />';}
}
?>


5 ejemplos:

Idiota
rae DETECTADO
directo DETECTADO
directo_plural LIMPIO
precisa DETECTADO
precisa_plural LIMPIO
directo_separado DETECTADO
directo_separado_plural LIMPIO

idiotas
rae DETECTADO
directo LIMPIO
directo_plural DETECTADO
precisa DETECTADO
precisa_plural DETECTADO
directo_separado LIMPIO
directo_separado_plural DETECTADO

crepusculo
rae LIMPIO
directo LIMPIO
directo_plural LIMPIO
precisa DETECTADO
precisa_plural LIMPIO
directo_separado LIMPIO
directo_separado_plural LIMPIO

soyputo
rae LIMPIO
directo LIMPIO
directo_plural LIMPIO
precisa DETECTADO
precisa_plural LIMPIO
directo_separado LIMPIO
directo_separado_plural LIMPIO

Soy un puto
rae LIMPIO
directo LIMPIO
directo_plural LIMPIO
precisa DETECTADO
precisa_plural LIMPIO
directo_separado DETECTADO
directo_separado_plural LIMPIO

En base a TRUE o FALSE se puede sacar un porcentaje que en caso de que sea igual o mayor de por no valido el nick pero....
seguira fallando en muchos casos... y se puede evitar de muchas formas...

c_u_l_o:
rae LIMPIO
directo LIMPIO
directo_plural LIMPIO
precisa LIMPIO
precisa_plural LIMPIO
directo_separado LIMPIO
directo_separado_plural LIMPIO

Saludos

free-articles

#9
Buenisimos, gracias.

Si alguien le sobra tiempo y ganas me gustaria aprender php
con alguien que tenga al lado,  y puedo exponer mis dudas
ipso facto y ser respondido, es lo que me falta, .aunque sea por messenger.

Nota: Algo sé  pero no paso de variables, if, else y poco más

Como pago yo puedo enseñarle a ganar dinero con marketing.
hola