IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

 Delphi Discussion :

Besoin d'une expression régulière


Sujet :

Delphi

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut Besoin d'une expression régulière
    Bonjour,

    Je cherche une expression régulière pour extraire le contenu des attributs "name" et "content" des balises <meta> d'une page Web.

    J'ai trouvé comment extraire le contenu HTML de la page mais j'ai vraiment du mal avec les regex.
    Auriez-vous quelque chose à me proposer ?

    Merci.

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,

    je sais que c'est moins bien, et que cela ne répond pas à ta question, mais moi je recherche les balises Href et scr avec la fonction Pos pour extraire des nom d 'mage et cela va très vite

    (je suis aussi un peu nul en expressions régulières ...)

    A+
    Charly

  3. #3
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    ce n'est pas trop mon rayon non plus ^^
    mais j'ai tenté et obtenu ceci:
    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
    //  <meta name="theme-color" content="#ffffff" />
    // seule les balises "meta" avec les attributs "name" et "content" seront traitées 
    procedure TForm1.Button2Click(Sender: TObject);
    var
      S1, S2: string;
      aMatches : TMatchCollection;
      aMatch : TMatch;
    begin
      S1 := '(?i).*<meta .*name="(?<Name>.[^"]*).*content="(?<Content>.[^"]*).*';
      with TStringList.Create do 
      try
        LoadFromFile('..\..\Win32\Debug\Page de teste.htm');                           
        S2 := Text;
      finally
        Free;
      end;
      Memo1.Clear;
      with TRegEx.Create(S1) do
      begin
        aMatches := Matches(S2);
        for aMatch in aMatches do
        begin
          with aMatch.Groups do 
            Memo1.Lines.Add(Format('Nom:%s Contenu:%s', [Item['Name'].Value, 
                                                         Item['Content'].Value]));
        end;
      end;
    end;
    d'autres pourront certainement améliorer ce code
    Cordialement,
    @+

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    RegEx or not RegEx telle est la question ? Je suis passé par là en "épluchant" les fichiers SVG (voir ces sources, tutoriel à venir mais un premier jus (tpath.pdf) se trouve sur github)
    dans ma première routine pour traiter un fichier SVG je suis passé par les expressions régulières
    L’objectif final récupérer ce qui se trouve entre les guillemets, derrière le d="
    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
     
     var
      SL: TStringList;
      Match: TMatch;
    begin
      if OpenDialog1.Execute then
      begin
    ...
     
        // Charge le fichier dans une TstringList préalablement crée 
        SL := TStringList.Create;
        try
          SL.LoadFromFile(OpenDialog1.FileName);
          // utilisation de l’expression régulière 
          Match := TRegEx.Match(SL.Text, 'd="(.*)"');
          while Match.Success do
          begin
           .... 
           Match := Match.NextMatch;
          end;
        finally
          FreeAndNil(SL);
        end;
    ...
      end;
    end;
    la seule différence, par rapport au code de Cirec, est que j'utiliserai une forme un peu plus compacte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Match := TRegEx.Match(S1);
          while Match.Success do
              Memo1.Lines.Add(Format('Nom:%s Contenu:%s', [Match.Groups.Item['Name'].Value, 
                                                         Match.Groups.Item['Content'].Value]));

    mais je me suis vite rendu compte des limitations, depuis j'ai "amélioré" le truc en utilisant XML
    Ici je ne récupère toujours que l'attribut d (mais avec moins d'erreurs que la routine au dessus) et cerise sur le gâteau je peux lire beaucoup plus de fichiers SVG

    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
    // nécessite les unités  Xml.XMLIntf, Xml.adomxmldom, Xml.XMLDoc
    procedure SVGLoadFromFile(const FileName: string;
                              const DestPath*: TPath);
    var
      Doc: IXMLDocument;
      Data,Node: IXMLNode;
      I : Integer;
      APathData : TPathData;
     
      procedure g(ANode : IXMLNode);
      var j : integer;
          CNode : IXMLNode;
          ASubPathData : TPathData;
      begin
       ASubPathData := TPathData.Create;
       for j:=0 to ANode.ChildNodes.Count-1 do
         begin
          CNode:=ANode.ChildNodes[j];
          if CNode.HasAttribute('d')
          then begin
              ASubPathData.Data:=CNode.Attributes['d'];
              DestPath.Data.AddPath(ASubPathData);
          end
          else g(CNode);
         end;
      end;
     
    begin
      DestPath.Data.Clear;
      APathData:=TPathData.Create;
     
      DefaultDOMVendor:='ADOM XML v4';
      Doc := LoadXMLDocument(FileName);
      Data:=Doc.DocumentElement;
     
      for I := 0 to Data.ChildNodes.Count-1 do
      begin
        Node := Data.ChildNodes[I];
        if Node.HasAttribute('d')
          then begin
              APathData.Data:=Node.Attributes['d'];
              DestPath.Data.AddPath(APathData);
          end
          else g(Node);
      end;
    end;
    Moralité : ne pas écarter XML
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    ...

    mais je me suis vite rendu compte des limitations, depuis j'ai "amélioré" le truc en utilisant XML
    Ici je ne récupère toujours que l'attribut d (mais avec moins d'erreurs que la routine au dessus) et cerise sur le gâteau je peux lire beaucoup plus de fichiers SVG

    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
    // nécessite les unités  Xml.XMLIntf, Xml.adomxmldom, Xml.XMLDoc
    procedure SVGLoadFromFile(const FileName: string;
                              const DestPath*: TPath);
    var
      Doc: IXMLDocument;
      Data,Node: IXMLNode;
      I : Integer;
      APathData : TPathData;
     
      procedure g(ANode : IXMLNode);
      var j : integer;
          CNode : IXMLNode;
          ASubPathData : TPathData;
      begin
       ASubPathData := TPathData.Create;
       for j:=0 to ANode.ChildNodes.Count-1 do
         begin
          CNode:=ANode.ChildNodes[j];
          if CNode.HasAttribute('d')
          then begin
              ASubPathData.Data:=CNode.Attributes['d'];
              DestPath.Data.AddPath(ASubPathData);
          end
          else g(CNode);
         end;
      end;
     
    begin
      DestPath.Data.Clear;
      APathData:=TPathData.Create;
     
      DefaultDOMVendor:='ADOM XML v4';
      Doc := LoadXMLDocument(FileName);
      Data:=Doc.DocumentElement;
     
      for I := 0 to Data.ChildNodes.Count-1 do
      begin
        Node := Data.ChildNodes[I];
        if Node.HasAttribute('d')
          then begin
              APathData.Data:=Node.Attributes['d'];
              DestPath.Data.AddPath(APathData);
          end
          else g(Node);
      end;
    end;
    Moralité : ne pas écarter XML
    J'ai fais les même testes et avec cette RegEx: '(?i).*\s*d="(?<d>.[^"]*z)"\s*.*/>.*' et
    je charge bien plus de fichiers svg (téléchargé sur https://publicdomainvectors.org/fr/)
    qu'avec la version XML.
    Bien sûr on ne peut pas tous les charger, certains fichiers provoquent toujours
    encore des erreurs de conversions mais j'ai pas trouvé pourquoi pour l'instant.

    Je testerai encore une méthode que j'utilise depuis un moment pour extraire du texte,
    méthode que j'ai éprouvée, ce qui me permettra de savoir si le problème c'est la RegEx ou autre chose.

    Cordialement,

    @+
    contiennent des

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Bonjour,

    J'ai finalement trouvé un site qui fournit des Regex (RegexLib) :
    http://www.regexlib.com/Search.aspx?...ookieSupport=1

    Au final, j'ai fait comme ceci :
    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
    function GetMetaTagContentFromHtml(Const html, tagName : String) : String;
    const MetaTag = '<meta[\s]+[^>]*?name[\s]?=[\s\"\'']+(.*?)[\s\"\'']+content[\s]?=[\s\"\'']+(.*?)[\"\'']+.*?>';
     
    var Regex : TRegExpr;
        Name : String;
    begin
      Result := '';
      Regex := TRegExpr.Create;
      try
        Regex.Expression := MetaTag;
        if (Regex.Exec(html)) then
        begin
          repeat
            Name := Regex.Match[1];
            if (SameText(Name, tagName)) then
            begin
              Result := Regex.Match[2];
              Break;
            end;
          until not(Regex.ExecNext);
        end;
      finally
        FreeAndNil(Regex);
      end;
     
    end;

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

Discussions similaires

  1. [egrep] Besoin d'aide pour une expression régulière
    Par het44 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 18/05/2013, 22h29
  2. Besoin d'aide pour une expression régulière
    Par StringBuilder dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 06/12/2012, 12h12
  3. Besoin d'aide pour une expression régulière
    Par chlon dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/07/2009, 16h41
  4. [RegEx] Besoin d'aide pour une expression régulière
    Par vallica dans le forum Langage
    Réponses: 4
    Dernier message: 04/09/2007, 19h59
  5. Besoin d'aide pour une expression régulière
    Par planetiss dans le forum Langage
    Réponses: 5
    Dernier message: 16/02/2006, 19h04

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