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

Langage PHP Discussion :

Saisie à trois parties [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2004
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : juin 2004
    Messages : 958
    Points : 1 409
    Points
    1 409
    Billets dans le blog
    3
    Par défaut Saisie à trois parties
    Ce serait pour définir une capture du genre <p> les_mots_au_milieu </p>

    J'imagine,
    que le premier terme va demander un truc comme commence par
    que troisième terme va demander un comme fini par
    Mais je n'ai aucune idée pour le milieu sans prendre la dernier terme.
    intel i7
    Mint 20
    Plasma et Cinnamon

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    juin 2003
    Messages
    7 775
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 7 775
    Points : 12 150
    Points
    12 150
    Par défaut
    en mettant des parenthèses, vous pouvez récupérer les 3 groupes séparement :
    (<p>) (.*) (</p>)
    https://regex101.com/r/6IijzT/1

  3. #3
    Membre expérimenté
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2004
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : juin 2004
    Messages : 958
    Points : 1 409
    Points
    1 409
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par mathieu Voir le message
    en mettant des parenthèses, vous pouvez récupérer les 3 groupes séparement :
    (<p>) (.*) (</p>)
    https://regex101.com/r/6IijzT/1
    Ha ha ! (.*) est le truc qui me manquait. Il me reste à trouver comment l'adapter à la notation des regex en Ruby.

    Un grand merci. Pour ce qui est des expressions régulières, je suis plutôt un débutant.

    Mais plus je pioche, plus je trouve des trucs intéressants. Je vais m'amuser comme un petit fou avec ce truc. Je vais tester cela sur Rubular.com
    intel i7
    Mint 20
    Plasma et Cinnamon

  4. #4
    Membre expérimenté
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2004
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : juin 2004
    Messages : 958
    Points : 1 409
    Points
    1 409
    Billets dans le blog
    3
    Par défaut
    Ruby utilise PCRE2
    La version Ruby:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    expression = '<p> Des tas de choses </p>'
    expression.match /(<p>) (.*) (<\/p>)/
    intel i7
    Mint 20
    Plasma et Cinnamon

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 246
    Points : 4 877
    Points
    4 877
    Par défaut
    Le moteur de regex de Ruby n'est pas PCRE mais onigmo depuis la version 2.0 de Ruby (avant cela, c'était oniguruma, onigmo est une évolution de ce précédent moteur). À noter au passage que les fonctions mb_ de PHP ayant rapport aux regex utilisent oniguruma et non PCRE2 comme les fonctions preg_*.

    Bref, quoi qu'il en soit pour parser du html, le mieux est un parser html qui comme son nom l'indique est fait pour ça (et évite le n'importe quoi qui adviendra à un moment ou l'autre suite à un bricolage avec des regex). Et ça tombe bien vu que Ruby dispose de l'excellent gem Nokogiri, ce qui nous donne:
    Code Ruby : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    require 'nokogiri'
     
    html = "<p>bidule truc</p>"
    parsed_data = Nokogiri::HTML.parse(html)
     
    puts parsed_data.xpath("//p/text()")
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Membre expérimenté
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2004
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : juin 2004
    Messages : 958
    Points : 1 409
    Points
    1 409
    Billets dans le blog
    3
    Par défaut
    Pourtant selon l'outil en lien que m'a fournie Mathieu, Ruby suit la convention PCRE2. Si on compare l'expression qu'il m'a fourni et l'expression en Ruby le (</p>) est devenu un (<\/p>)/. J'ai donné un exemple avec une balise HTML. Mais ce que j'ai en tête est un outil pour changer les déclaration de type en Pascal en déclaration de type en Julia.
    intel i7
    Mint 20
    Plasma et Cinnamon

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 246
    Points : 4 877
    Points
    4 877
    Par défaut
    La plupart des moteurs de regex ont, on va dire, un tronc commun (de syntaxe ou de comportement) qui fait qu'au premier abord on peut croire qu'ils sont interchangeables, et, il en va donc de même pour leurs testeurs en ligne respectifs. Mais il n'en est rien: dés qu'on sort du basique les différences apparaissent. C'est vrai que onigmo et PCRE on pas mal de similitudes (notamment du fait qu'ils sont tous les deux beaucoup plus proche de Perl que d'autres moteurs comme ceux de Javascript ou Python), néanmoins leurs différences sont nombreuses et ne tiendraient pas sur une page. On peut très bien utiliser regex101 la plupart du temps, mais si ça coince à cause d'une différence de syntaxe ou d'une fonctionnalité qui n'existe que dans l'un et pas dans l'autre, tu peux toujours te tourner vers Rubular.

    J'ai donné un exemple avec une balise HTML. Mais ce que j'ai en tête est un outil pour changer les déclaration de type en Pascal en déclaration de type en Julia.
    Vaste programme! Néanmoins mon conseil précédent reste toujours valable, car dés que tu vas commencer à devoir gérer des cas particuliers (comme par exemple un type placé dans une chaîne de caractères ou un commentaire) tes patterns risquent de devenir de plus en plus complexes. C'est pourquoi se tourner vers un parser déjà existant simplifie grandement la tâche et évite les erreurs.

    Je doute que tu trouves un parser de Pascal dans un gem Ruby (sait-on jamais!), par contre plusieurs gems proposent des lexers (comme par exemple Parslet). C'est un travail important de devoir décrire la grammaire d'un langage avec un lexer, mais: 1 - les patterns resteront relativement basiques, 2 - avec un peu de chance tu ne sera pas obligé de décrire le langage dans tous ces détails, juste ce qui correspond à tes besoins, 3 - tu éviteras les pièges.

    Bon courage.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre expérimenté
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2004
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : juin 2004
    Messages : 958
    Points : 1 409
    Points
    1 409
    Billets dans le blog
    3
    Par défaut
    Je connais Rubular. Mais je préfère regex101, car il est plus bavard dans ses messages. La conversion des arguments me suffit. En raison de la présence des Goto et des longjumps, la conversion du Pascal peut difficilement se faire sans intervention humaine. Et il y a les fonctions des tableaux et les chaînes de caractères qui doivent remplace par leur équivalent en Julia, histoire d'éliminer les redondances inutiles.

    Merci,. quand même!
    intel i7
    Mint 20
    Plasma et Cinnamon

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

Discussions similaires

  1. [RegEx] Diviser en trois parties un texte
    Par deubelte dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2013, 11h44
  2. Apprendre Perl rapidement en trois parties
    Par djibril dans le forum Langage
    Réponses: 0
    Dernier message: 20/02/2013, 14h10
  3. Tableaux en trois parties
    Par PoppyGuy dans le forum Mise en page CSS
    Réponses: 19
    Dernier message: 08/12/2011, 13h17
  4. Séparation en trois partie d'une page html
    Par theNoob dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/09/2009, 18h02
  5. comment diviser une page jsf en trois partie
    Par info_plus dans le forum JSF
    Réponses: 9
    Dernier message: 02/04/2008, 16h25

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