Foros del Web » Programando para Internet » PHP »

regex para dominios IDN

Estas en el tema de regex para dominios IDN en el foro de PHP en Foros del Web. Hola a todos, A ver si podeis hecharme una mano, que soy en auntentico inutil para las regex, necesito una para filtrar nombre válidos de ...
  #1 (permalink)  
Antiguo 18/04/2006, 19:51
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 13 años, 10 meses
Puntos: 1
regex para dominios IDN

Hola a todos,

A ver si podeis hecharme una mano, que soy en auntentico inutil para las regex, necesito una para filtrar nombre válidos de dominos ACE (normales) o IDN (con á,é,ü,ñ,etc...). Solo para la parte de segundo nivel (osea de google.com solo comprobaré google el .com lo voy a quitar antes).

Si alguien puede hecharme una mano le estaré eternamente agradecido.

Po cierto, ¿conoceis algún conversor ACE <-> IDN en PHP? Yo solo lo he encontrado en Perl

Un saludo.
__________________
Guarda tus configuration files
  #2 (permalink)  
Antiguo 18/04/2006, 22:27
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 14 años, 6 meses
Puntos: 2
Realmente de dominios ACE e IDN no tengo la menor idea, pero puedes identificar facilmente los caracteres de esta forma

Código PHP:
<?php
  
if (eregi("[a-zA-Z0-9]{2,100}",$dominio) && !eregi("[ñ]",$dominio)) { echo 'dominio ACE'; }
  elseif (
eregi("[áéñü]{2,100}",$dominio)) { echo 'dominio IDN'; }
?>
Deberia funcionar... o quizas no te entendi bien...

Saludos!

PD: El {2,100} es la cantidad minima y maxima de caracteres...
__________________
I Love Programming...
  #3 (permalink)  
Antiguo 18/04/2006, 22:37
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
Pero qué pasaría si ...

if (eregi("[a-zA-Z0-9]{2,100}",$dom.....

... si $dominio dijera $domino = "#######abcabcabc";

Me parece que lo que está dentro de ese if regresaría un true, ¿no?

Lo mejor es que nos ayude con eso de los ACE e IDN, ¿de qué se trata esa conversión?
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #4 (permalink)  
Antiguo 18/04/2006, 22:44
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 14 años, 6 meses
Puntos: 2
No, porque la expresion regular le esta diciendo que solo de true (en realidad tira un echo :p) si son caracteres alfanumericos (menos la Ñ)... entonces si pone "·$#@|dominio" daria false...

Y obviamente [áéñü]{2,100} debe completarlo con todos los caracteres posibles en un dominio IDN (no tengo ni idea...), por ejemplo [áéíóúñü#â]{2,100}...

en fin, es una idea, estaria mejor entender bien que es esto de ACE e IDN....
__________________
I Love Programming...
  #5 (permalink)  
Antiguo 18/04/2006, 22:52
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
Saludos.

Más bien me refería a que no estamos forzando a que se la totalidad de la cadena, por eso es que sí se imprime el echo, pero así muy seguro no estaba, así que tuve que probarlo:

Código PHP:
//
<?
$dominio 
"###########abcabc";
if (
eregi("[a-zA-Z0-9]{2,100}",$dominio) )
    echo 
"Esto sí se imprime."//dominio raro

if (eregi("^[a-zA-Z0-9]{2,100}$",$dominio) )
    echo 
"Esto no se imprime.";

?>
=)
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #6 (permalink)  
Antiguo 19/04/2006, 17:29
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 13 años, 10 meses
Puntos: 1
He estado probando y el de FuLaNo_ me detecta todo lo que le pongo como ACE. El de uamistad si filtra bien (aunque le falta añadir el caracter "-" solo para caracteres interiores). Pero no detecta IDN.

IDN (Internationalized Domain Name) son los dominios con caracteres no anglosajones. Lo que pasa es que estos dominios en realidad "no existen" sino que los navegadores, clientes de correo, etc... tienen que convertirlos a un equivalente ACE que son los que de verdad existe.

Así, por ejemplo el domino dólares.com no existe, sino que cuando se hace una petición al navegador este le hace la transformación y lo convierte en xn--dlares-bxa.com. Y es con este último con el que se trabaja.

Podeis encontrar más información en la wikipedia.
__________________
Guarda tus configuration files
  #7 (permalink)  
Antiguo 19/04/2006, 17:48
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 14 años, 6 meses
Puntos: 2
Es que el de uamistad no esta completo, era solo una corrección de lo que habia posteado yo, pon esto:

Código PHP:
<?php
if (eregi("^[a-zA-Z0-9\-]{2,100}$",$dominio) && !eregi("^[ñ]$",$dominio)) {
    echo 
"Dominio ACE";
}
elseif (
eregi("^[áéñüó]{2,100}$",$dominio)) { 
  echo 
'Dominio IDN';

?>
Para que entiendas un poco de expresiones regulares, el caracter ^ hace referencia a la primer letra, o al primer grupo de letras, dependiendo de como siga la expresion. El caracter $ es, por decirlo de alguna manera, el "antonimo" de ^, es decir que hace referencia al ultimo juego de caracteres de un texto...

Gracias por la explicacion de los dominios, ahora bien, donde se registra el dominio dólar.com ?? es decir, se que chile hace poco agrego la letra "ñ" a sus dominios, ahora es posible registrar ñandu.com.cl, pero no he visto dominios internacionales, y tampoco muchos dominios de paises con caracteres "raros"...
__________________
I Love Programming...
  #8 (permalink)  
Antiguo 19/04/2006, 23:53
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 13 años, 10 meses
Puntos: 1
Ahora los ACE los detecta correctamente. Pero los IDN sigue si aceptarlos.

Esto no me devuelve nada.
Código PHP:
<?
$dominio 
"dólares";

if (
eregi("^[a-zA-Z0-9\-]{2,100}$",$dominio) && !eregi("^[ñ]$",$dominio)) {
    echo 
"Dominio ACE";
}
elseif (
eregi("^[áéñüó]{2,100}$",$dominio)) { 
  echo 
'Dominio IDN';


?>
Yo nunca he registrado un dominio con IDN, pero por ejemplo si haces un whois a españa.com puedes ver que está registrada en eNom. Aunque lo que tienes que registrar es la versión ACE, ya que como digo los IDN son "virtuales". Supongo que no se ven muchos porque al no estar la gente todavía acostubrada no son muy prácticos.

Para registrar dominios chilenos supongo que tendrás que dirigirte a nic.cl
__________________
Guarda tus configuration files
  #9 (permalink)  
Antiguo 19/04/2006, 23:59
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
Hola bictor, más o menos entendí el ejemplo de dólares.com

Visité la wiki, pero no entendí mucho.

Lo que quieres hacer, con expresiones regulares se ve que queda bastante fácil, todo está en entender lo que hay que hacer.

Podrías poner varios ejemplos de el dominio origen y cómo debería quedar en el destino.

Después de encontrar el patrón viendo algunos ejemplos, seguro que a más de uno se le ocurre una bonita expresión regular.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #10 (permalink)  
Antiguo 20/04/2006, 00:47
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 13 años, 10 meses
Puntos: 1
Aqui pongo una lista de dominos y el resultado que deberían dar. Espero que sea lo suficientemente larga.

forosdelweb -> ACE
2foros-del-web -> ACE
-forosdelweb -> Error (el - solo se acepta como separador)
dólares -> IDN
españa -> IDN
ñandú -> IDN
ñan-dú -> IDN
ñandú- -> Error
agüero10 -> IDN
agüe_car -> Error (el guión bajo no esta permitido)
domi?nio -> Error
domi/nio -> Error
dominio! -> Error

La verdad es que a parte de ñáéíóúäëïöü no se cuantos caracteres más seran aceptables, pero supongo que una vez hecha la expresión será facil ir añadiendolos.
__________________
Guarda tus configuration files
  #11 (permalink)  
Antiguo 20/04/2006, 02:14
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
Mr. BictorMan, eso sí que está claro !

Chécate esta función:

Código PHP:

//
function discriminador($dominio){
     
//definiendo conjuntos frecuentes
     
$usa "a-z0-9"//alfanuméricos
     
$lat "a-z0-9áéíóúñü"//latinos permitidos

     //definiendo patrones
     
$patronACE "^[$usa][$usa-]+[$usa]$";
     
$patronIDN "^[$lat][$lat-]+[$lat]$";

     
//tomando decisiones
     
if( ereg($patronACE,$dominio) ) return "ACE";
     elseif( 
ereg($patronIDN,$dominio) ) return "IDN";
     else return 
"Error";
    }
//end function 

EDITO:
Se me olvidó poner que ya la probé con tu lista:

Código PHP:

//
header("Content-Type: text/plain");

$cadena[] = "forosdelweb"// -> ACE
$cadena[] = "2foros-del-web"// -> ACE
$cadena[] = "-forosdelweb"// -> Error (el - solo se acepta como separador)
$cadena[] = "dólares"// -> IDN
$cadena[] = "españa"// -> IDN
$cadena[] = "ñandú"// -> IDN
$cadena[] = "ñan-dú"// -> IDN
$cadena[] = "ñandú-"// -> Error
$cadena[] = "agüero10"// -> IDN
$cadena[] = "agüe_car"// -> Error (el guión bajo no esta permitido)
$cadena[] = "domi?nio"// -> Error
$cadena[] = "domi/nio"// -> Error
$cadena[] = "dominio!"// -> Error

$i 0;
foreach(
$cadena as $dominio)
    echo 
"\n".++$i.") ".$dominio.' -> '.discriminador($dominio); 
y me imprime lo siguiente:

Código:
1) forosdelweb -> ACE
2) 2foros-del-web -> ACE
3) -forosdelweb -> Error
4) dólares -> IDN
5) españa -> IDN
6) ñandú -> IDN
7) ñan-dú -> IDN
8) ñandú- -> Error
9) agüero10 -> IDN
10) agüe_car -> Error
11) domi?nio -> Error
12) domi/nio -> Error
13) dominio! -> Error
Suerte !
__________________
"Di no al Internet Explorer" -Proverbio Chino-

Última edición por uamistad; 20/04/2006 a las 02:21
  #12 (permalink)  
Antiguo 20/04/2006, 13:53
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 13 años, 10 meses
Puntos: 1
Señor uamistad, sepa usted que tiene mi gratitud eterna.

La verdad es que viendo ahora la función parece hasta facil. Pero claro, una cosa es verlo antes y otra bien distinta entenderlo después.


Lo dicho, muchisimas gracias!
__________________
Guarda tus configuration files
  #13 (permalink)  
Antiguo 20/04/2006, 22:47
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
Qué bueno que te sirvió y sobre todo qué bueno que le entendiste, porque así la puedes editar fácilmente si algo le falta, por ejemplo, ahorita que veo parece que en tu lista faltó ejemplo como:

FOROSDELWEB.COM

que es un dominio bastante válido, pero esa función arrojaría ERROR. Usando eregi en lugar de ereg se resuelve eso, pero no funcionará con DÓLARES.COM, en cuyo caso, habría que agregar a los caracteres latinos: ÁÉÍÓÚÜÑ.

Saludos amigo !
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #14 (permalink)  
Antiguo 21/04/2006, 06:21
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 13 años, 10 meses
Puntos: 1
No te preocupes, los .com, .net, etc... se los pienso quitar antes con un explode().
La función me va perfecta.

Gracias de nuevo.
__________________
Guarda tus configuration files
  #15 (permalink)  
Antiguo 21/04/2006, 06:25
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
ahhh, más bien me refería, no al .com, sino a los dominios con maýusculas. Si alguien checa un dominio con mayúsculas, debería ser válido, pero esa función tal cuál, marcaría un error.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #16 (permalink)  
Antiguo 26/04/2006, 15:46
 
Fecha de Ingreso: abril-2006
Mensajes: 3
Antigüedad: 11 años, 7 meses
Puntos: 0
Necesito ayuda

Compre un dominio en mi pais ( Chile) el cual presentaba un caracter incluido en el formato de IDN en este caso (ñ), hasta ayer ; cuando visite mi url me encontre con la "sorpresa"; no tenia idea de que explorer no podria ejecutar la correcta visualizacion del sitio. En mi pais la relacion de explorer a firefox + otros navegadores con soporte a IDN es de 1/10 con suerte.

Entonces para mi es un gran problema.

Luego ante mis dudas ingreso:españa.com
con explorer y me aparece una especie de autodeteccion de Verisign.
(que a mi entender solo funciona con los .net y .com y que en mi caso.cl habria que modificar los dns del proovedor de dominios cl) para instalar el I-NAV...quizas lo puedo instalar yo pero todos los demas que quieran acceder a mi sitio no lo podran ver nunca desde explorer.

viendo el codigo de fuente y me aparece esto:
perl/main.pl
no se absolutamente nada de perl.

mi pregunta es como logro "llamar" al I-Nav desde mi sitio y que mi url detecte al explorer y me recomiende instalar el I-nav. tal como lo hacen en españa.com

Lo agradeceria.

Andres Moraga.
  #17 (permalink)  
Antiguo 26/04/2006, 15:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
xoem .. intenta realizar tu pregunta en el foro de "Dominos y Hosting" (por si hay algo en tus DNS o similar que tocar) y/o en otros foros ("Ayuda general"?, "Software"?) ..

El problemas que tienes no lo resulve directamente ni PHP ni Perl (por otra pregunta exactamente igual realizada en otro tema).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 04:03.