BlackTDN Search

quarta-feira, 4 de abril de 2012

BlackTDN :: Validando Expressões Regulares em ADVPL usando PowerShell

Em BlackTDN :: Expressões Regulares ~ RegExp via Ezzy Learning Validation vimos como validar Expressões Regulares usando uma aplicação WEB através de Socket, HTTPGet e Post.
 
Neste novo exemplo, veremos a validação através do Windows® PowerShell®.
powershell Para que o "script" possa ser executado faz-se necessário autoriza-lo através do Windows® PowerShell® , sendo assim, execute o Windows® PowerShell® e digite o seguinte comando: get-help about_signing. Esse comando irá listar as opções de "Diretivas de Assinatura e de Execução" de "Script", leia-as atentamente. Mas se quiser pular esse passo (eu não recomendo)digite o seguinte comando no Windows® PowerShell® : Set-ExecutionPolicy Unrestricted. Esse comando fará que qualquer "Script" seja executado em sua máquina (mas atente para os ítens de segurança listados à partir do comando get-help about_signing).
 
Segue o Fragmento do código que faz a validação:
/*/
    Funcao: PSRegEx
    Autor:  Marinaldo de Jesus
    Data:   03/04/2012
    Uso:    Exemplo de Uso de RegExp via PowerShell
/*/
Static Function PSRegEx( cString , cPattern )
    Local cMatch            := ""
    Local cPSScript         := ""
    Local cPSOutPath        := GetTempPath()
    Local cPSOutFile        := CriaTrab(NIL,.F.)
    Local cPSOutPathFile    := ( cPSOutPath + cPSOutFile+".ini" )
    Local cPSFileScript        := cPSOutFile
    Local cPSScriptPathFile    := ( cPSOutPath + cPSFileScript+".ps1" )
    Local oTFIni
    Local lMatch            := .F.
    BEGIN SEQUENCE
        While File( cPSOutPathFile ) .or. File( cPSScriptPathFile )
            cPSOutFile          := CriaTrab(NIL,.F.)
            cPSOutPathFile        := ( cPSOutPath + cPSOutFile+".ini" )
            cPSFileScript        := cPSOutFile
            cPSScriptPathFile    := ( cPSOutPath + cPSFileScript+".ps1" )
        End While
        cPSScript += '"'
        cPSScript += '[PS_REGEX]'
        cPSScript += '`r`n'
        cPSScript += 'match='
        cPSScript += '"'
        cPSScript += '+'
        cPSScript += '([regex]::ismatch("'+cString+'","'+cPattern+'")).ToString()
        cPSScript += ' | '
        cPSScript += 'Out-File -Encoding "ASCII" "' + cPSOutPathFile + '"'
        MemoWrite( cPSScriptPathFile , cPSScript )
        IF !File( cPSScriptPathFile )
            BREAK
        EndIF
        WaitRun( "POWERSHELL " + cPSScriptPathFile  )
        IF !File( cPSOutPathFile )
            BREAK
        EndIF
        oTFIni    := TFINI():New( cPSOutPathFile )
        cMatch    := oTFIni:GetPropertyValue("PS_REGEX","match")
        DEFAULT cMatch := "FALSE"
        cMatch    := Upper( cMatch )
        lMatch    := ( cMatch == "TRUE" )
        oTFIni    := FreeObj( oTFIni )
    END SEQUENCE
    IF File( cPSScriptPathFile )
        fErase( cPSScriptPathFile )
    EndIF
    IF File( cPSOutPathFile )
        fErase( cPSOutPathFile )
    EndIF
Return( lMatch )
 
Usei a Classe TFIni para Carregar informações salvas pelo Windows® PowerShell® e, em função disso, as dependências para a execução dos testes aumentaram.
 
Com esse novo exemplo teremos as seguintes saídas no Console do Protheus Server:

RegExp: [SoapRegExp][1.1][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [SoapRegExp][1.2][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [HttpGetRegExp][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [HttpPostRegExp][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]
RegExp: [PSRegEx][mail@blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.T.]

RegExp: [SoapRegExp][1.1][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [SoapRegExp][1.2][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [HttpGetRegExp][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [HttpPostRegExp][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]
RegExp: [PSRegEx][mail_blacktdn.com.br][^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+.([a-zA-Z]{2,4})$][.F.]

RegExp: [SoapRegExp][1.1][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpGetRegExp][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpPostRegExp][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [PSRegEx][111.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpGetRegExp][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [HttpPostRegExp][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]
RegExp: [PSRegEx][111111111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [SoapRegExp][1.2][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [HttpGetRegExp][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [HttpPostRegExp][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]
RegExp: [PSRegEx][1a1.111.111-11][(^\d{3}\.?\d{3}\.?\d{3}-\d{2})|(^\d{3}\d{3}\d{3}\d{2})$][.F.]

RegExp: [SoapRegExp][1.1][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpGetRegExp][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpPostRegExp][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [PSRegEx][53.113.791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpGetRegExp][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpPostRegExp][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [PSRegEx][53113791/0001-22][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [SoapRegExp][1.2][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpGetRegExp][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [HttpPostRegExp][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]
RegExp: [PSRegEx][53113791000122][^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$][.T.]

RegExp: [SoapRegExp][1.1][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [SoapRegExp][1.2][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [HttpGetRegExp][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [HttpPostRegExp][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]
RegExp: [PSRegEx][123PWDRegEx436][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.T.]

RegExp: [SoapRegExp][1.1][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [SoapRegExp][1.2][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [HttpGetRegExp][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [HttpPostRegExp][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]
RegExp: [PSRegEx][@#PWDRegEx#@][^(.*(([^a-z1-9]+.*\d+)|(\d+.*[^a-z1-9]+)).*)$][.F.]

 
Para obter a nova versão do Programa de teste, agora com validação de RegEx via Windows® PowerShell® clique aqui.
 
Para consultar o código, clique aqui.
 
Obs.:
 
1) No exemplo Utilizei WaitRun, logo a validação se dará no Client. Para que a validação ocorra no server consulte:

2) Leia “Password Strength Validation with Regular Expressions” para entender como validar senhas com expressões complexas.

[]s
иαldσ dj

3 comentários:

  1. Opa obrigado naldo... farei meus testes... eu quase nao uso power shell em meu cotidiano, mas essa solução me pareceu muito mais interessante do que acessar um webservice externo.... o jeito é treinar...

    Israel Neves.

    ResponderExcluir
  2. Israel,

    Obviamente que são soluções paliativas. Dada a minha criatividade poderia implementa-las de n formas.
    Considerando que a Totvs usa a biblioteca QT da Nokia para desenvolver o Client a implementação de RegEx seria muito fácil se ela exportasse a classe QRegExp (http://qt-project.org/doc/qt-4.8/QRegExp.html) do QT para uso no Protheus.

    ResponderExcluir
  3. Parabéns!

    taí um bom site para testar suas criações..

    http://myregexp.com/signedJar.html

    ResponderExcluir