Μη-αποθηκευτικές παρενθέσεις στις κανονικές εκφράσεις της PHP
Οι παρενθέσεις () εκτελούν δύο λειτουργίες -
ομαδοποίηση χαρακτήρων και λειτουργία "πακέτου" (capturing group). Και
τι κάνουμε αν χρειαζόμαστε ομαδοποίηση,
αλλά δεν θέλουμε να το βάλουμε σε "πακέτο";
Για την επίλυση αυτού του προβλήματος έχουν σχεδιαστεί ειδικές
μη-αποθηκευτικές παρενθέσεις (?: )
- ομαδοποιούν, αλλά δεν τοποθετούν σε "πακέτο".
Παράδειγμα
Στο επόμενο παράδειγμα, οι πρώτες παρενθέσεις χρειαζόμαστε για ομαδοποίηση, και οι δεύτερες - για "πακέτο". Ωστόσο, και οι δύο παρενθέσεις αποθηκεύουν δεδομένα σε "πακέτο":
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Σαν αποτέλεσμα, στα "πακέτα" μας θα έχουμε τα εξής:
<?php
var_dump($res[0]); // θα εμφανίσει 'abab123'
var_dump($res[1]); // θα εμφανίσει 'ab'
var_dump($res[2]); // θα εμφανίσει '123'
?>
Παράδειγμα
Ας κάνουμε έτσι ώστε το πρώτο ζευγάρι παρενθέσεων μόνο να ομαδοποιεί, αλλά να μην τοποθετεί σε "πακέτο":
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Σαν αποτέλεσμα, στο πρώτο "πακέτο" θα έχουμε τον αριθμό μας:
<?php
var_dump($res[1]); // θα εμφανίσει '123'
?>
Πρακτικές ασκήσεις
Δίνονται υποσυμβολοσειρές, χωρισμένες σε δύο μέρη
από ένα αυθαίρετο αριθμό ζευγών $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Βρείτε κάθε μία από αυτές τις υποσυμβολοσειρές και για κάθε μία υποσυμβολοσειρά που βρέθηκε, τοποθετήστε στο πρώτο "πακέτο" αυτό που βρίσκεται πριν από τον διαχωριστή, και στο δεύτερο "πακέτο" - αυτό που βρίσκεται μετά από τον διαχωριστή.