Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : septembre 2014
    Messages : 9
    Points : 17
    Points
    17

    Par défaut Problème avec une expression régulière : invalid escape sequence

    Bonjour à tous

    je voudrais faire un petit serveur http avec luajit 2.0 , j'ai donc compilé httpd , auccun problème à ce moment là mais lors de l'appel à httpd.start_server("8080", "./hostv") j'ai l'erreur suivante lors de l'execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    httpd.lua:376: invalid escape sequence near '"'
    Et à cette ligne il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     _, _, ext  = string.find( file, "\.([^\.]+)$" );
    c'est donc un problème d'expression regulière , il y a t-il une syntaxe ou une solution spécifique à luajit ?
    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 327
    Points : 12 088
    Points
    12 088
    Billets dans le blog
    7

    Par défaut

    Bonjour ! Je confirme qu'avec Lua 5.2 ça ne passe pas. Il semble que l'expression régulière ne soit pas valable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i, j = string.find(s, "\.([^\.]+)$" ); -- invalid escape sequence
     
    print(i, j)
    Pourrais-tu donner un exemple de chaîne à traiter et de résultat attendu ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : septembre 2014
    Messages : 9
    Points : 17
    Points
    17

    Par défaut

    Oui , ça vient des sources httpd.lua la fonction en question est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    function handleRequest( root, host, path, client )
        --
        -- Local file
        --
        file = path;
     
     
        --
        --  File must be beneath the vhost root.
        --
        file = root .. host .. "/htdocs" .. file ;
     
        --
        --  Attempt to sanitize the input Virtual Host + requested path.
        --
        file = string.strip( file );
     
     
        --
        -- Add a trailing "index.html" to paths ending in / if such
        -- a file exists.
        --
        -- Otherwise if it is a directory then serve it.
        --
        if ( string.endsWith( file, "/" ) ) then  
            tmp = file .. "index.html";
            if ( fileExists( tmp ) ) then
               file = tmp;
            else
               if ( socket.is_dir( file ) ) then
                   size = handleDirectory( client, file, path ) ;
                   socket.close( client );
                   return size, "200";
               end
            end
        end
     
     
     
     
        --
        -- Open the file and return an error if it fails.
        --    
        if ( fileExists( file ) == false ) then 
            size = sendError( client, 404,"File not found " .. urlEncode( path ) );
            socket.close( client );
            return size, "404";
        end;
     
     
        --
        -- Find the suffix to get the mime.type.
        --
        _, _, ext  = string.find( file, "\.([^\.]+)$" );
        if ( ext == nil ) then
           ext = "html";   -- HACK
        end
     
        type = mime[ext];
        if ( type == nil ) then type = 'text/plain' ; end;
     
        --
        -- Send out the header.
        --
        socket.write( client, "HTTP/1.0 200 OK\r\n" );
        socket.write( client, "Server: lua-httpd " .. socket.version .. "\r\n" );
        socket.write( client, "Content-type: " .. type  .. "\r\n" );
        socket.write( client, "Connection: close\r\n\r\n" );
     
        --
        -- Read the file, and then serve it.
        --
        f       = io.open( file, "rb" );
        size    = fileSize( f );
        local t = f:read("*all")
        socket.write( client, t );
        f:close();
     
        return size, "200" ;
    end
    D'ailleurs je pense que je pourrais directement mettre ext = "html" sans gêner le comportement du programme mais je voudrais savoir pourquoi avec luajit les regexp pose problème . et en quoi la syntaxe que tu m'as donné est différente dans sont comportement ? Je suis pas très doué en regexp

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : janvier 2013
    Messages : 388
    Points : 713
    Points
    713

    Par défaut

    Salut !
    La caractère d'échappement est le "%" en Lua, et pas le "\". Et alors ça fonctionne très bien.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 327
    Points : 12 088
    Points
    12 088
    Billets dans le blog
    7

    Par défaut

    OK, je crois que j'ai compris. Il s'agit d'extraire le suffixe ou l'extension d'un nom de fichier. Donc je pense que la modification suivante fait l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s = "http://www.eschecs.fr/index.html"
    i, j = string.find(s, "%.([^%.]+)$" ); -- 28 32
    print(i, j)
    print(string.sub(s, string.find(s, "%.([^%.]+)$" ))); -- .html
    L'erreur (je pense) était de vouloir "échapper" les points avec un "\". Le point est un caractère magique, il doit être "échappé" avec "%".

    The character `%´ works as an escape for those magic characters. So, '%.' matches a dot; '%%' matches the character `%´ itself. You can use the escape `%´ not only for the magic characters, but also for all other non-alphanumeric characters. When in doubt, play safe and put an escape.
    For Lua, patterns are regular strings. They have no special treatment and follow the same rules as other strings. Only inside the functions are they interpreted as patterns and only then does the `%´ work as an escape. Therefore, if you need to put a quote inside a pattern, you must use the same techniques that you use to put a quote inside other strings; for instance, you can escape the quote with a `\´, which is the escape character for Lua.
    P.-S. Vu la réponse de __dardanos__ après avoir posté.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : septembre 2014
    Messages : 9
    Points : 17
    Points
    17

    Par défaut

    Merci à vous , mon serveur tourne maintenant !
    Donc voici ma nouvelle expression : "%.([^%.]+)$" .

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 327
    Points : 12 088
    Points
    12 088
    Billets dans le blog
    7

    Par défaut

    J'ajoute que si tu veux l'extension sans le point (ce qui paraît être l'intention initiale, vu les parenthèses), il faut plutôt écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s = "http://www.eschecs.fr/index.html"
    ext = string.match(s, "%.([^%.]+)$")
    print(ext) -- html

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    décembre 2011
    Messages
    3 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 327
    Points : 12 088
    Points
    12 088
    Billets dans le blog
    7

    Par défaut

    Citation Envoyé par Roland Chastain Voir le message
    J'ajoute que si tu veux l'extension sans le point (ce qui paraît être l'intention initiale, vu les parenthèses), il faut plutôt écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s = "http://www.eschecs.fr/index.html"
    ext = string.match(s, "%.([^%.]+)$")
    print(ext) -- html
    Ah non, ce n'est pas nécessaire. Je n'avais pas pris garde à la façon dont la fonction était appelée et j'avais oublié une particularité de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _, _, ext = string.find(s, "%.([^%.]+)$" );
    -- If the pattern has captures, then in a successful match the captured values
    -- are also returned, after the two indices.
    print(ext); -- html
    L'écriture avec string.match est quand même plus simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/04/2009, 10h00
  2. [c# REGEX]Problème avec une expression régulière
    Par mezzo_998 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/11/2007, 14h03
  3. Problème avec une expression régulière ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 1
    Dernier message: 28/04/2007, 19h50
  4. problème avec une expression régulière
    Par sissi25 dans le forum Regex
    Réponses: 2
    Dernier message: 19/04/2007, 10h12
  5. Problème avec une expression régulière
    Par Darkroro dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2006, 13h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo