Metele el html raw de casi cuaaaalquier sitio de licencias y esto las limpia ;)
Option Explicit
'=================================================
' º Nombre : mParseKeys.bas
' º Version : 2.0
' º Autor : Milton Candelero
' º Alias : ElementalCode
' º Pais : Argentina
' º Fecha : 13/OCT/2011
' º Dedicado a: El amor de mi vida
' º Licencia : GNU PUBLIC LICENCE v.3 (Or higher)
'=================================================
' This file is part of Open Nod32 Keyfinder.
'
' Open Nod32 Keyfinder is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or any later version.
'
' Open Nod32 Keyfinder is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with Open Nod32 Keyfinder. If not, see <http://www.gnu.org/licenses/>.
Function ParseKeys(ByVal sHTML As String, ByRef sUser() As String, ByRef sPass() As String)
'Constantes para los patterns de busqueda
Const USERPATTERN As String = "(?:EAV|TRIAL|ESS)-\d{8}"
Const PASSPATTERN As String = "(?:[pP]?assword:? |[pP]?assword:?|nod32key:)(\w{10})"
'Declarar variables para RegExp
Dim oREuser As RegExp
Dim oREpass As RegExp
'Variables para las colecciones de resultados
Dim oMCuser As MatchCollection
Dim oMCpass As MatchCollection
'Variables para las coincidencias
Dim oMuser As Match
Dim oMpass As Match
'Variables para los indices de las strings de salida _
y previamente la cantidad de repeticiones (ahorro variables)
Dim cU As Byte
Dim cP As Byte
'Crear los objetos del RegExp User y analizar
Set oREuser = New RegExp
With oREuser
.Global = True
.Pattern = USERPATTERN
Set oMCuser = .Execute(sHTML)
End With
'Crear los objetos del ExpReg Pass y analizar
Set oREpass = New RegExp
With oREpass
.Global = True
.Pattern = PASSPATTERN
Set oMCpass = .Execute(sHTML)
End With
'Dimensionar el array
cU = oMCuser.Count - 1
ReDim sUser(cU) As String
cU = 0 ' Vuelvo a cero para seguir usando esta variable.
'Guardar Resultados user
For Each oMuser In oMCuser
sUser(cU) = oMuser
cU = cU + 1
Next
'Dimensionar el array
cP = oMCpass.Count - 1
ReDim sPass(cP) As String
cP = 0 ' Vuelvo a cero para seguir usando esta variable.
'Guardar Resultados pass
For Each oMpass In oMCpass
sPass(cP) = oMpass.SubMatches(0)
cP = cP + 1
Next
'Destruir RegExp para ahorrar memoria y porque queda lindo :D
Set oREuser = Nothing
Set oREpass = Nothing
End Function
La regExp de password se poria educir a
(?:[pP]?assword:? |nod32key:)(\w{10})
:O a ver que pruebo y lo añado, gracias.
todavia patino un poco en esto de las regexp :P
No funciono, necesito que me reconozca
password: asgiaha
password:asgiaha
y eso falla :P
Citar
' º Nombre : mParseKeys.cls
¿Una clase para una función? :rolleyes:
Quedaría más bonito si en vez de ingresar dos arrays utilizas un
Type.
Option Explicit
Public Type NodUP
User As String
Password As String
End Type
Public Function ParseKeys(ByRef sHTML As String) As NodUP()
Creo que te puedes ahorrar el crear dos objetos, con uno yo creo que valdría. :P
Usas esto:
(?:[pP]?assword:? |[pP]?assword:?|nod32key:)(\w{10})
Según lo tienes puesto, con el
[pP]?, también te sacaría
"assword". (
"palabra culo" en inglés :-X).
Utilizando
IgnoreCase cuando creas el objeto para que no se fije en ninguna mayúscula. :)
Yo pondría algo así:
(password|nod32key)\s*:?\s*(\w{10})
DoEvents! :P
aja ni cuenta me habia dado del .cls
Pense en usar un Type pero me parecio medio rebuscado al pedo.
ademas no se si lo lei o estaba borracho que escribir resultados mediante byref es mas rapido que escribirlos como resultado de la funcion.
:silbar:
Y esta bueno esa expresion regular, pero me gusta mas asi
(ya no detecta assword :P)
(?:(?:[pP]{1})assword:?\s?|nod32key:?\s?)(\w{10})
No tengo ni jodida idea de como hacer que sea case sensitive o no :D
Así se pone:
Set oREpass = New RegExp
With oREpass
.Global = True
.Pattern = PASSPATTERN
.IgnoreCase = True
Set oMCpass = .Execute(sHTML)
End With
La expresión regular que pones es fea y repites cosas. Lo más sencillo siempre mejor. ;)
Cita de: Elemental Code en 23 Mayo 2012, 12:28 PM
ademas no se si lo lei o estaba borracho que escribir resultados mediante byref es mas rapido que escribirlos como resultado de la funcion.
:silbar:
Sería un procedimiento, puesto que no devuelve ningún valor, y si la velocidad es problema, siempre puedes hacer esto:
Option Explicit
Public Type NodUP
User As String
Password As String
End Type
Public Function ParseKeys(ByRef sHTML As String, ByRef UP As NodUP())
'// code
End Sub
DoEvents! :P
Ups, perdon se me paso un ? al contestar (estaba en el cel, no pidas mucho :xD)
igual cuando es uno solo no hace falta poner {1} ni tampoco poner otro grupo no capturador
(?:[pP]assword:?\s*|nod32key:?\s*)(\w{10})
\s* significa que pueden haber tantos espacios como quieran, más flexible :P