Lommer i regulære udtryk i PHP
Indholdet af lommer er tilgængeligt ikke kun i erstatningsstrengen, men også i selve det regulære udtryk: vi kan lægge noget i en lomme, og derefter direkte i det regulære udtryk sige, at her skal stå indholdet af denne lomme.
Indholdet af lommer er tilgængeligt via deres numre,
hvortil der står et omvendt skråstreg. For eksempel,
vil den nulte lomme være tilgængelig sådan her: \0,
den første lomme sådan her - \1, den anden
- \2 og så videre.
Jeg er sikker på, at alt hvad der er skrevet ovenfor indtil videre er ret utydeligt for dig. Det er ikke overraskende, da lommer er det mest uforståelige sted i regulære udtryk. Lad os se på det med eksempler.
Eksempel
Lad os sige, at vi har en streng som denne:
<?php
$str = 'aa bb cd ef';
?>
Lad os finde alle steder i den, hvor der står to ens bogstaver i træk. For at løse opgaven vil vi søge efter ethvert bogstav, lægge det i en lomme, og derefter kontrollere, om det næste tegn er indholdet af denne lomme:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ! cd ef'
Eksempel
Lad os sige, at vi har en streng som denne:
<?php
$str = 'asxca buzxb csgd';
?>
Lad os finde alle ord i den, hvor det første og sidste bogstav er ens. For at løse opgaven skriver vi følgende mønster: bogstav, derefter et eller flere bogstaver mere, og derefter det samme bogstav som det første:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ! csgd'
Eksempel
I stedet for \1 kan man skrive \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Eksempel
Man kan også skrive \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Eksempel
I krøllede parenteser kan man angive negative tal. I dette tilfælde vil lommerne tælles fra slutningen:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktiske opgaver
Givet en streng:
<?php
$str = 'aaa bbb ccc xyz';
?>
Find alle delstrenge, hvor der er tre ens bogstaver i træk.
Givet en streng:
<?php
$str = 'a aa aaa abab bbbb';
?>
Find alle delstrenge, hvor der er to eller flere ens bogstaver i træk.
Givet en streng:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Find alle delstrenge, hvor der er to ens ord i træk.