Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: kinos en 20 Septiembre 2010, 23:40 pm



Título: expresion regular selección entre varias palabras
Publicado por: kinos en 20 Septiembre 2010, 23:40 pm
Buenas:

   ¿Cómo puedo hacer una expresión regular para que me indique si $palabra pertenece al grupo de palabras admitidas? Es que esta expresión permite palabras como "netttt", "comfjhg", "orgreja" y estas no deberían ser aceptadas.

Código
  1.   function es_palabra_valida($palabra) {
  2.                    if (ereg("(com|net|org)", $palabra)) {
  3.                        echo "La palabra $palabra es correcta<br>";
  4.                        return true;
  5.                    } else {
  6.                        echo "La palabra $palabra no es válida<br>";
  7.                        return false;
  8.                    }
  9.                }
  10.  


Título: Re: expresion regular selección entre varias palabras
Publicado por: ~ Yoya ~ en 20 Septiembre 2010, 23:47 pm
especifica un poco mas, y no use ereg ya es una función obsoleta ahora se usa preg_match...

Quieres que com, net y org este al final de la palabra... Trata de especificar lo que quieres hacer...


Título: Re: expresion regular selección entre varias palabras
Publicado por: kinos en 20 Septiembre 2010, 23:55 pm
ok.

No al final sino que me devuelva true o false si está en este grupo {com, net, org}.


Título: Re: expresion regular selección entre varias palabras
Publicado por: ~ Yoya ~ en 21 Septiembre 2010, 00:02 am
que grupo¿¿??

si la palabra a pasar es: hcomla te la acepta
Ej:
Código
  1. <?php
  2.  
  3. $palabra = 'hcomasa';
  4. if(preg_match('/[com|net|org]/i',$palabra))
  5. {
  6. echo 'si';
  7. }
  8. ?>
Salida:
Código:
si

Dame un ejemplo de lo que quieres hacer...


Título: Re: expresion regular selección entre varias palabras
Publicado por: Shell Root en 21 Septiembre 2010, 00:02 am
Igual debería ser al final de la cadena. Por ejemplo,
Correctas,
Código:
www.google.org
www.google.com
www.google.net

No correctas,
Código:
www.google.org.edu
www.google.com.co
www.google.net.gov

Código
  1. (com|net|org)$


Título: Re: expresion regular selección entre varias palabras
Publicado por: kinos en 21 Septiembre 2010, 00:15 am
Haber si me explico mejor...  :silbar:

Correctas:

net
com
org

No correctas:

comunidad
orgullo
www.google.com
www.google.net

No se si una expresión regular sería la forma mas correcta, quizás con guardar en un array {net, com, org} y comparar $palabra con cada una para saber si es una de ellas. Quiero utilizar la expresión regular mas que nada por comodidad y por si es mas eficiente.



Título: Re: expresion regular selección entre varias palabras
Publicado por: ~ Yoya ~ en 21 Septiembre 2010, 00:24 am
Código
  1. <?php
  2.  
  3. $host = array('google.com','www.google.org','www.google.org.edu','www.google.com','www.google.org.gov');
  4.  
  5.  
  6. foreach($host as $result)
  7. {
  8.   if(preg_match('/\.?[com|net|org]$/i',$result, $captura))
  9.   {
  10.      echo "Valida-> $result<br />";
  11.   }else{
  12.      echo "No valida-> $result<br />";
  13.         }      
  14. }
  15.  
  16. ?>

Salida:
Código:
Valida-> google.com
Valida-> www.google.org
No valida-> www.google.org.edu
Valida-> www.google.com
No valida-> www.google.org.gov


Título: Re: expresion regular selección entre varias palabras
Publicado por: kinos en 21 Septiembre 2010, 00:36 am
a ver que estamos rizando el rizo...

Correctas:

"nada por delante"com"nada por detrás"
"nada por delante"net"nada por detrás"
"nada por delante"org"nada por detrás"

No correctas:

www.google.org.gov
www.google.com
www.google.org.edu
www.google.org
comunidad
orgullo
www.google.com
www.google.net

Únicamente son correctas las palabras com, net, org.
Las palabras no correctas son todas las demás ya lleven "com" "net" "org" incluida en alguna parte ya sea delante, en medio, al final, o no lo lleven.

Correctas:

if(palabra == "com" || palabra == "net" || palabra =="org"){
   //es correcta
}else{
   //no es correcta
}


Título: Re: expresion regular selección entre varias palabras
Publicado por: kinos en 21 Septiembre 2010, 01:14 am
Lo tengo ~ Yoya ~ :

Código
  1. <?php
  2. $host = array('com','net','org','google.com','www.google.org','www.google.org.edu','www.google.com','www.google.org.gov');
  3.  
  4.  
  5.                foreach($host as $result) {
  6.                    if(ereg('^(com|net|org)$',$result, $captura)) {
  7.                        echo "Valida-> $result<br />";
  8.                    }else {
  9.                        echo "No valida-> $result<br />";
  10.                    }
  11.                }
  12. ?>

Salida:

Valida-> com
Valida-> net
Valida-> org
No valida-> google.com
No valida-> www.google.org
No valida-> www.google.org.edu
No valida-> www.google.com
No valida-> www.google.org.gov

Lo único que con preg_match no me lo hace bien, no se porque...

Gracias.


Título: Re: expresion regular selección entre varias palabras
Publicado por: ~ Yoya ~ en 21 Septiembre 2010, 02:32 am
Que raro xD

Código
  1. <?php
  2. $host = array('com','net','org','google.com.net','www.google.org','www.google.org.edu','www.google.com','www.google.org.gov');
  3.  
  4.  
  5.               foreach($host as $result) {
  6.                   if(preg_match('/^(net|com|org)$/i',$result)) {
  7.                       echo "Valida-> $result<br />";
  8.                   }else {
  9.                       echo "No valida-> $result<br />";
  10.                   }
  11.               }
  12. ?>


Título: Re: expresion regular selección entre varias palabras
Publicado por: Nakp en 21 Septiembre 2010, 09:00 am
pues con esto:

Código
  1. [^\.\w](com|org|net)[^\.\w]

obtuve:

"com" google.com  com comasagua organizacion org netcat net enet .net


Título: Re: expresion regular selección entre varias palabras
Publicado por: kinos en 21 Septiembre 2010, 16:12 pm
Hay dos cosas que no entiendo:

- qué significa esta expresión $/i
- por qué hay que poner la barra delante /^


Título: Re: expresion regular selección entre varias palabras
Publicado por: Shell Root en 21 Septiembre 2010, 16:44 pm
Código
  1. / /*Aquí ExpReg */ $/i
  2. ^ /* Inicio de palabra */
  3. $ /* Final de palabra */


Título: Re: expresion regular selección entre varias palabras
Publicado por: ~ Yoya ~ en 21 Septiembre 2010, 20:24 pm
Código
  1. [^\.\w](com|org|net)[^\.\w]

Umm, recordando que con las expresiones regulares se debe tener muchos cuidado, esa expresion no filtra bien y no funcionaria correctamente, seguro porque no la haz probado y la pusiste de rápido xD. Me acordó a algunos vectores XSS xDDD.

Código
  1. [^\.\w](com|org|net)[^\.\w]
[^\.\w](com|org|net)[^\.\w]

Hay esta el problema, primero estas indicando que algo debe existir delante y de tras de (com|org|net) para poder cumplirse la expresión, osea si ingreso com, org,  net me la rechazara ya que para poder coincidir debe existir aunque sea una palabra delante y detrás, antes de entrar al paréntesis de captura...

Tambien no filtra bien las palabras debido a esto:
Código
  1. [^\.\w]
Estas indicando que al principio y al final debe existir una palabra que no contenga caracteres alfanuméricos o puntos...

Ejemplo:
Código:
<?php

$host = array('"êĻĥáĶéŕ•com"', 'com', '"com"','==org==');


foreach($host as $result)
{
   if(preg_match('/[^\.\w](com|org|net)[^\.\w]/',$result, $captura))
   {
      echo "Valida-> $result<br />";
   }else{
      echo "No valida-> $result<br />";
         }      
}

?>

Salida:
Código:
Valida-> "êĻĥáĶéŕ•com"
No valida-> com
Valida-> "com"
Valida-> ==org==



i es para que no distinga entre mayúscula y minúscula(Case sensitive (http://es.wikipedia.org/wiki/Case_sensitive))