Ayuda modificar cadena de texto

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Ayuda modificar cadena de texto

Mensaje por chekok »

Hola amigos

Necesito de vuestra ayuda, como puedo modificar un texto, por ejemplo
$texto = "192.168.1.35"
y dejarlo en
$texto = "192.168.1."
es decir borrar los caracteres que haya a la derecha de la cadena hasta que encuentre el primer punto "."

He estado mirando la ayuda y he encontrado como añadir, sustituir o buscar en una cadena, peor no he visto nada sobre como eliminar de esta manera. En el foro también he buscado y no encuentro nada al respecto o no he sabido verlo, estoy un poco espeso. :smt010
Espero vuestra ayuda, mil gracias!!!
La vida es larga y dura.
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Ayuda modificar cadena de texto

Mensaje por chekok »

Bueno he encontrado una solución un poco chapucera a lo que necesito dando vuelta y más vueltas a las funciones de cadenas de texto de la ayuda, que es eliminar el último bloque de una dirección ip de la siguiente manera:

Código: Seleccionar todo

$ip = StringSplit("192.168.1.33",".")
$ip_rango = $ip[1] & "." & $ip[2] & "." & $ip[3] & "."
MsgBox(0,"",$ip_rango)
Con esto ya me funciona lo que quiero conseguir, pero agradecería una manera más elegante de conseguir este resultado.

Gracias amigos.
La vida es larga y dura.
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Ayuda modificar cadena de texto

Mensaje por jamaro »

Yo probaria con expresiones regulares. seleccionando los tres primeros grupos.
No tengo Autoit ahora pero si no encuentras la solución lo miro mañana.


Saludos
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Ayuda modificar cadena de texto

Mensaje por jamaro »

He probado, y en principio, con la expresión regular (.*\.) obtendrías lo que buscas (al menos en el ejemplo anterior).

La expresión es:
. Cualquier carácter
* repetido 0 o más veces
\. El carácter punto como tal

Con lo cual muestra todo lo que encuentra hasta el último punto (incluido)

Si no necesitas el punto final, sería: (.*)\.

Código: Seleccionar todo

$ip = "192.168.1.33"
$ip_mod=StringRegExp($ip,"(.*\.)",1)
MsgBox(0,"",$ip_mod[0])
Saludos
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Ayuda modificar cadena de texto

Mensaje por chekok »

El tema es que estoy haciendo una pequeña gui que muestra las direcciones ip activas en una red local leyendo automáticamente la dirección ip del equipo desde el que se ejecuta. Para saber cuantos equipos hay conectados y poder banear aquellas direcciones que no deberian estar en la red (por lo de las intrusiones wifi más que nada) o saber con que ips puedes mantener comuncación para enviar mensajes o ficheros por socket (esto ya sería un segundo apartado del programa para más adelante). Espero acabarlo pronto y pasaros el code.

Lo que hago es leer la ip del equipo en cuestión, por ejemplo: 192.168.1.25 y con esa dirección hago un ping en todas las direcciones posibles dentro de esa red, es decir desde la 192.168.1.0 hasta la 192.168.1.255, de ahí que necesite eliminar solo el último bloque de la dirección leída del equipo.

Al ser una IP, el código que estoy usando ahora funciona bien, pero como hasta ahora no he tocado el manejo de cadenas en autoit no se si es la más adecuada o políticamente correcta la forma que estoy usando.

Gracias jamaro por la ayuda.
La vida es larga y dura.
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Ayuda modificar cadena de texto

Mensaje por Jonny »

Si lo que quieres es modificar el último bloque de una dirección IP, no hay una función AutoIt para eso, ni una función de tratamiento de cadenas que te pueda servir, pues lo que quieres es modificar una cadena variable, en longitud y contenido...

Como decía jamaro, podría hacerse con ER's, pero no creo que sea necesario, con un poco de tratamiento de cadenas puedes hacerlo igual de bien, sin hacerlo demasiado complejo.

Veamos un poco de teoría para ver como resolver el problema:

Las direcciones IP, están formadas por cuatro bloques, y cada uno de ellos puede comprender entre 0 y 255 (esto es lo que realmente nos interesa).

Como lo que queremos es modificar el último bloque, los tres primeros nos dan igual, por lo que no es necesario analizarlos. Además, como sabemos que la dirección IP siempre tendrá cuatro bloques, pues no hay ni que contar los bloques que tiene, por lo que podemos centrarnos únicamente en el último bloque.

También sabemos, que los bloques de las direcciones IP se separan por puntos (.). Por lo qué, para saber como es el último bloque (longitud y valor) hemos de trabajar con el último punto (.) de la dirección IP, pero tenemos un problema: No sabemos la longitud del último bloque (1, 2 o 3 dígitos). Por lo que no sabemos donde está exactamente el último punto.

Es entonces, cuando hemos de empezar a aplicar tratamiento de cadenas con las funciones que nos proporciona AutoIt, que son más que suficientes.

En este caso, no nos interesa tanto el valor del último bloque de la dirección IP (que podría obtenerse fácilmente) si no, la cantidad de dígitos que contiene. para ello, hemos de contarlos extrayendo carácteres, ayudándonos de una condición múltiple, por ejemplo.
Sabiendo cuantos carácteres contiene el último bloque, sólo nos queda eliminarlos y poner en su lugar el valor por el que queramos modificarlos.

todo esto parece un poco complicado, pero con la función que te he hecho de ejemplo verás que no lo es tanto.

Puedes usarla tal cual está. Como verás, te sirve tanto para direcciones IP privadas o públicas. La función tiene dos o tres líneas de más, que hacen un control de errores, que si bien no es del todo necesario, no está de más ;).
La función está documentada, para que veas fácilmente lo que hace, si hay algo que no entiendes.

Código: Seleccionar todo

   Global $LocalIP=@IpAddress1 ;IP local del equipo.

 Func _IPAddressMod($ArgIP, $ArgValMod) ;Función "_IPAddressMod()".
  #CS


   ----------

   Descripción:
   - Modifica el último bloque de la dirección IP recibida.
   *No modifica la dirección IP del equipo.
   Parámetro(s):
   - $ArgIP: Dirección IP.
   Puede ser pública o pribada.
   - $ArgValMod: Valor por el que se desea modificar el último bloque de "$ArgIP".
   Valor(es) de retorno:
   - <>0="$ArgIP" con el último bloque modificado.
   - 0=Ocurrió un error al modificar el último bloque de "$ArgIP".
   Autor: Jonny.

   ----------


  #CE
   Local $Buff_ModIP ;Almacenar la dirección IP modificada.
   If (($ArgIP=="") Or (($ArgValMod=="") Or (StringIsDigit($ArgValMod)=0) Or (Number($ArgValMod)<0 Or Number($ArgValMod)>255))) Then Return 0 ;Si "$ArgIP" o "$ArgValMod" no reciben un valor esperado - Devuelve código de error ("0").
   Select ;Verifica los dígitos que contiene el último bloque de "$ArgIP".
    Case StringRight(StringTrimRight($ArgIP, 1), 1)=="." ;Un dígito.
     $Buff_ModIP=StringTrimRight($ArgIP, 1)&$ArgValMod ;Modifica el último bloque de "$ArgIP", por "$ArgValMod".
     Return $Buff_ModIP ;Devuelve código de ejecución correcta ("$Buff_ModIP").
    Case StringRight(StringTrimRight($ArgIP, 2), 1)=="." ;Dos dígitos.
     $Buff_ModIP=StringTrimRight($ArgIP, 2)&$ArgValMod ;Modifica el último bloque de "$ArgIP", por "$ArgValMod".
     Return $Buff_ModIP ;Devuelve código de ejecución correcta ("$Buff_ModIP").
    Case StringRight(StringTrimRight($ArgIP, 3), 1)=="." ;Tres dígitos.
     $Buff_ModIP=StringTrimRight($ArgIP, 3)&$ArgValMod ;Modifica el último bloque de "$ArgIP", por "$ArgValMod".
     Return $Buff_ModIP ;Devuelve código de ejecución correcta ("$Buff_ModIP").
    Case Else ;Más de tres dígitos.
     Return 0 ;Devuelve código de error ("0").
   EndSelect ;End -> Verifica los dígitos que contiene el último bloque de "$ArgIP".
 EndFunc ;End -> Función "_IPAddressMod()".

Msgbox(0, "", _IpAddressMod($LocalIP, 0))
Exit
Espero te sirva.

Salu2!
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Ayuda modificar cadena de texto

Mensaje por BasicOs »

Los textos y sus variables son información, datos, info.. palabras, etc... que se pueden reutilizar... :smt007 :smt007

Una alternativa sería con

buscar desde la izquierda un número donde está el primer punto y coger la parte izquierda del string hasta el punto

$result =StrinLeft($laip, StringInStr($laip,".",0,-1))


o igual bien donde se encuentra la tercera ocurrencia del punto
$result =StrinLeft($laip, StringInStr($laip,".",0,3)-1)

Salu22:)
La función TextodentroDeTexto:
http://www.autoitscript.com/autoit3/doc ... gInStr.htm
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Ayuda modificar cadena de texto

Mensaje por Jonny »

Sí, pero quería modificar el último bloque, no el primero :).

Ahora que dices lo de la "ocurrencia del punto", me he acordado de la función StringInSTR(), con la que podrías buscar el último punto de la cadena. Con eso y alguna función más, podría remplazarse en una sóla línea, sí. Aunque como yo lo he hecho parece que lía menos, no hay tantas funciones anidadas ;). Además, yo lo he hecho más como función genérica...

Salu2!
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Ayuda modificar cadena de texto

Mensaje por BasicOs »

Jonny
La funcion localiza el ultimo punto y luego elimina lo q esta después del punto :smt023

Pruébalo
$result =StrinLeft($laip, StringInStr($laip,".",0,-1))

Puedes usar un -1 o bien un 3 como quieras
Salu:)
Responder