Groeperen en hierarchisch matchen

Alterneren staat toe dat je uit verschillende alternatieven kunnen kiezen, maar soms wil je tussen verschillende regexps kunnen kiezen, en soms voor verschillende onderdelen van regeps. Bijvoorbeeld housecats of housekeepers. De regexp housecat|housekeepers zal dat doen, maar is niet erg efficient omdat we house twee keer hebben moeten typen. Het zou mooi zijn om onderdelen van de regexp constant te houden en uit anderen te kunnen kiezen bijvoorbeeld cat|keep.
De grouping metacharacters: () zorgen dat sommige delen als een worden beschouwt. Dus housecat|housekeep kan worden house(cat|keeper).

Voorbeelden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
/(a|b)b/     matched ab of bb
/ac|b)b/     matched acb of bb
/(^a|b)c/    matched ac aan het begin of bc overal in de string
/(a|[bc])d/  matched ad, bd of cd
/house(cat|) matched housecat of house
/house(cat(s|)|)  matched of housecats, housecat of house. (Let op: het innestelen van groepen is mogelijk)
/(19|20|)\d\d/ matched de jaren 19xx, 20xx, of het Y2K probleem: xx


Alternatie gedraagd zich binnen groepen op dezelfde manier als erbuiten. De eerste die voorkomt zal matchen, en de eerste uit de alternatie die mogelijk kan matchen zal matchen.

Hoe dit precies werkt is uitgelegd in een stap bij stap analyse van het volgende commando:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
preg_match("/(abd|abc)(df|d|de)/", "abcde");
?>


1: Begin met de eerste letter in de string 'a'
2: probeer het eerste alternatief 'abd'
3: match 'a', gevolgd door 'b', to nu toe gaat het goed
4: 'd' in de regexp matched 'c' niet in de string, en deze optie gaat niet werken. Dus moeten we twee tekens terug en proberen we het tweede alternatief uit de groep abc
5: Match 'a' gevolgd door 'b' gevolgd door 'c', dit gaat goed en de eerste groep gaat werken.
6: Ga verder naar de tweede groep en kies het eerste alternatief 'df'
7: Match de 'd'
8: 'f' in de regexp matched de 'e' in de string niet en deze optie gaat niet werken, twee tekens terug, en we gaan verder met het tweede alternatief groep 'd'
9: 'd' matched, de tweede groep matched 'd'
10: we zijn aan het eind van de regexp, en we zijn kaar. We hebben 'abcd' uit de string 'abcde'

Wat opvalt is dat het derde alternatief uit de tweede groep ook 'de' had, maar 'd' was voldoende om de regexp te matchen en toen is de regexp gestopt. Ook was het al bij het eerste teken mogelijk om 'a' te matchen. Was dit niet mogelijk geweest waren eerst alle mogelijk matches verkend voordat we met het hele verhaal bij 'b' opnieuw waren begonnen. Als alle mogelijke opties niet hadden gewerkt, zou preg_match als waarde false terug geven.

Reguliere expressies zijn ondanks al dit werk nog opmerkelijk snel, ondanks dit is preg_match sneller dan de strtr en str_replace functies in php. Zie: http://www.simplemachines.org/community/index.php?topic=175031.0;imode

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Voorwoord
  2. My First Regex
  3. Het gebruik van character classes
  4. Het een of het ander matchen
  5. Groeperen en hierarchisch matchen
  6. Het extraheren van matches
  7. Repeterende matches
  8. Disclaimer, bronvermelding, handige links, TODO

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.