Named Capture Grouping i RegExp, PHP

Jeg oppdaget, over IRC, en temmelig genial funksjon i regulære uttrykk som du kan bruke i store uttrykk som trenger bedre grupperinger i preg_match_all(). Det er en funksjon som kan brukes til å navngi nøkkelverdiene til resultatene som du får i arrayen du får ut av preg_match_all(). Så om du har et stort uttrykk hvor det kan være kjedelig å bruke kun nummeriske indekser på arrayen, kan du bruke «Named Capture Grouping» i RegExp til å holde styr på hva det er som blir hentet.

Metoden jeg viser her vil kun fungere i Python, PCRE og PHP i følge regular-expressions.info. Det ligger ikke mer magi bak det enn bokstaven P og noen andre små tegn.

De fleste av oss vet hvordan vi grupperer resultat i regexp, vi bruker paranteser. Dette er et eksempel på hvordan du kan hente ut informasjon ved gruppering:

  1. <?php
  2. $string = '10 usle små kaniner danset på Stadion';
  3.  
  4. $matches = array ();
  5. $regex = '/^(\d+) usle små (\w+) danset på (\w+)\z/';
  6. preg_match_all($regex, $string, $matches);
  7.  
  8. echo 'Det var '.$matches[1][0].' '.$matches[2][0].' på '.$matches[3][0];
  9. ?>

Om du har mange resultat er det ikke tvil om at kun numeriske indekser kan bli forvirrende når du skal skille de fra hverandre. Derfor har vi «Named Capture Grouping» som kan hjelpe deg i å holde orden på styret.

Små endringer i uttrykket til dette:

  1. /^(?P<quantity>\d+) usle små (?P<object>\w+) danset på (?P<location>\w+)\z/

Så har vi plutselig kontroll på hva vi henter ut. Da ser eksemplet over slik ut:

  1. <?php
  2. $string = '10 usle små kaniner danset på Stadion';
  3.  
  4. $matches = array ();
  5. $regex = '/^(?P<quantity>\d+) usle små (?P<object>\w+) danset på (?P<location>\w+)\z/';
  6. preg_match_all($regex, $string, $matches);
  7.  
  8. echo 'Det var '.$matches['quantity'][0].' '.$matches['object'][0].' på '.$matches['location'][0];
  9. ?>

Et godt tips til kontroll i komplekse uttrykk.

Videre lesing til andre systemer kan gjøres på

Redigert 28. august

Noe jeg glemte å nevne som gjør det enda mer genialt er muligheten for bakover referanse med named capture fremfor numeriske verdier. I regulære uttrykk kan man, som mange vet, bruke \\TALL til å referere til grupperinger i uttrykket, men også dette kan bli vanskelig å holde styr på når kompleksiteten øker.

Derfor kan man bruke named capture grouping til å holde styr på dette også. Det er til og med samme bokstav som blir brukt.

Her kommer et eksempel:

  1. /<input type="checkbox" id="label-(?P<imdbId/>t{2}\d{7})" name="movie\[\]" value="(?P=imdbId)" \/>/

Du bruker med andre ord (?P=name) når du har lagd grupperingen.

2 responser om “Named Capture Grouping i RegExp, PHP”

  1. Veldig fint, takk. Er det noe nevnverdig tregere i noen grad?


  2. Nei det er ikke noe forskjell i kjøretid, etter som jeg har testet ut.


Legg igjen respons

Fyll ut alle felt markert med *

Brukerinformasjon
  1. Kan bruke følgende html: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> og [html] [css], [mysql] og [php] Hold posten ren og fin!

    Siter valgt tekst

E-post-varsel uten å skrive kommentar.

Info om posten

Innlegget ble postet 27.08.07 17:06 og ligger under kategorien PHP / MySQL. Du kan abonnere på kommentarene ved å bruke RSS 2.0 feed. Du kan legge til kommenter, eller trackback fra din blogg/side.

Resurser

Arkiver

Metainfo


Siste Flickr-bilder

  • Commentsystem (20070308)
  • Ukraina Aksjonen 2006 (20070306)
  • Mikael Brevik blogg (20070306)
  • Mikael Brevik (20070306)
  • Brukerdefinert side - AVIS2 (20070306)
  • Brevik Webutvikling (20070306)
  • skyscraper
  • visittkort