Partage
  • Partager sur Facebook
  • Partager sur Twitter

Regex : match en excluant une partie de la regex

    20 novembre 2019 à 14:45:54

    Bonjour,

    Cela fait depuis le début de la journée que je me casse la tête sur un problème.

    J'ai plusieurs chaines de caractères(par exemple)

    Test -> test(glace -> glagla) -> glup
    Test -> test(glace -> glagla)
    Test -> test(glace -> glagla(glace -> glagla())) -> glup

    J'aimerais écrire une Regex qui match les " -> " mais pas celles qui sont au milieu des parenthèses

    Comme ceci :

    Test -> test(glace -> glagla) -> glup
    Test -> test(glace -> glagla)
    Test -> test(glace -> glagla(glace -> glagla())) -> glup

    J'ai testé pas mal de chose mais rien ne fait ce que je veut. Je ne suis pas très bon en regex donc je me dit il vaut mieux un qui sait que 10 qui cherches :D

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 novembre 2019 à 16:07:31

      Bonjour, à priori il faut un masque récursif comme ICI où j'ai changé le ?R par ?1 en ajoutant la dite capture (moins les espaces du mode x) qu'il suffirait ensuite de passer avec (*SKIP)(*FAIL) sinon |-> pour capturer la sous chaîne qui ne sera donc pas entre parenthèses.

      <pre><?php
      $chaine = '
      Test -> test(glace -> glagla) -> glup
      Test -> test(glace -> glagla)
      Test -> test(glace -> glagla(glace -> glagla())) -> glup
      Test -> test(glace -> glagla(glace -> glagla() -> glup)) -> glup
      Test -> test(glace -> glagla(glace -> glagla() -> glup) -> glup
      ';
      
      echo preg_replace('#(\(((?>[^()]+)|(?1))*\))(*SKIP)(*FAIL)|->#', '<b style="color:red">$0</b>', $chaine);

      me retourne

      Test -> test(glace -> glagla) -> glup
      Test -> test(glace -> glagla)
      Test -> test(glace -> glagla(glace -> glagla())) -> glup
      Test -> test(glace -> glagla(glace -> glagla() -> glup)) -> glup
      Test -> test(glace -> glagla(glace -> glagla() -> glup) -> glup
      • Partager sur Facebook
      • Partager sur Twitter

      Regex : match en excluant une partie de la regex

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown