Autor
|
Tema: Duda en Php como identificar un texto? (Leído 6,822 veces)
|
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
|
|
|
En línea
|
hola
|
|
|
free-articles
|
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?
|
|
« Última modificación: 17 Febrero 2013, 02:46 am por Ex_Tan€R »
|
En línea
|
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. $lista_negra = array('idiota','jilipichi','tonto','eres gilipollas o peinas setas?');
Luego lo podrías comprobar con in_array(); 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.. 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
|
|
|
En línea
|
|
|
|
free-articles
|
Excelente El 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
|
|
« Última modificación: 17 Febrero 2013, 10:54 am por Ex_Tan€R »
|
En línea
|
hola
|
|
|
jdc
|
Toca usar la creatividad, por ejemplo no es lo mismo "insulto" que " insulto "
|
|
|
En línea
|
|
|
|
SCM
Desconectado
Mensajes: 17
|
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.htmlSi 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.
|
|
« Última modificación: 18 Febrero 2013, 21:13 pm por SCM »
|
En línea
|
|
|
|
#!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
|
|
|
En línea
|
|
|
|
SCM
Desconectado
Mensajes: 17
|
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.
|
|
|
En línea
|
|
|
|
#!drvy
|
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. <?php function buscar_rae($palabra=NULL){ if(empty($palabra)){return false;} // Obtenemos la respuesta JSON de una API para la RAE. // 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>'; } ?>
En este caso devolvería algo así: 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 <?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. $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'); // Buscar en la RAE? if($rae!==false){ $url = 'http://rae-quel.appspot.com/json?query='.urlencode($nick); // 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 LIMPIOdirecto LIMPIOdirecto_plural LIMPIOprecisa LIMPIOprecisa_plural LIMPIOdirecto_separado LIMPIOdirecto_separado_plural LIMPIOSaludos
|
|
« Última modificación: 19 Febrero 2013, 01:59 am por drvy | BSM »
|
En línea
|
|
|
|
free-articles
|
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.
|
|
« Última modificación: 23 Febrero 2013, 18:07 pm por free-articles »
|
En línea
|
hola
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
como identificar el lenguaje
Ingeniería Inversa
|
ornitorrinco
|
3
|
2,666
|
10 Septiembre 2005, 17:34 pm
por tena
|
|
|
Identificar una cadena de texto en un archivo.
« 1 2 »
Programación Visual Basic
|
Impersecuto
|
10
|
3,959
|
26 Julio 2007, 00:36 am
por Tengu
|
|
|
duda como posicionar texto?
« 1 2 »
Programación Visual Basic
|
Sai-To
|
15
|
6,305
|
23 Mayo 2008, 01:49 am
por byebye
|
|
|
Identificar texto dentro de otro
Programación C/C++
|
deividmor
|
1
|
1,747
|
19 Febrero 2017, 23:58 pm
por ivancea96
|
|
|
Como identificar una IP
« 1 2 »
Seguridad
|
mz39720
|
13
|
8,544
|
9 Septiembre 2020, 01:52 am
por elliotmadness
|
|