Editors Picks

Κυριακή 4 Σεπτεμβρίου 2011

Μικρή εισαγωγή στα regular expressions

- ΜΠΟΡΕΙ ΝΑ ΦΑΙΝΕΤΑΙ ΔΥΣΚΟΛΟ ΑΛΛΑ ΣΤΟ ΤΕΛΟΣ ΓΙΝΕΤΑΙ ΜΑΝΙΑ -

Με τα regular expressions μπορούμε να αναγνωρίζουμε ακολουθίες χαρακτήρων. Η ανθρώπινη νοημοσύνη μας δίνει την δυνατότητα να καταλαβαίνουμε ενότητες γραμμάτων και αριθμών. Για έναν υπολογιστή όμως αυτό είναι πολύ δύσκολο γιατί στην δικιά του αντίληψη όλα είναι bits και bytes.

Τα regular expressions λειτουργούνε σαν τα φίλτρα των file managers. Σε έναν file manager γράφουμε για παράδειγμα *.php για να βρούμε όλα τα αρχεία που τελειώνουν σε .php . Τα regular expressions είναι μια πολύ προχωρημένη έκδοση τέτοιων φίλτρων.

Στα regular expressions της γλώσσας Perl (στην οποία βασίζεται και η PHP) χρησιμοποιούμε χαρακτήρες για να δηλώσουμε την αρχή και το τέλος ενός μοτίβου (pattern)। Μας βολεύει να χρησιμοποιήσουμε έναν χαρακτήρα που δεν επαναλαμβάνεται από το pattern μας. Συνήθως χρησιμοποιείται το slash.


Παράδειγμα 1: Βρες το "abc" οπουδήποτε σε ένα string
κώδικας:
/abc/

Σύμβολο: $
Το $ στο τέλος του pattern συμβολίζει ένα string που κλείνει με το pattern μας.

Παράδειγμα 3: Βρες το "abc" στο τέλος του string
κώδικας:
/abc$/

Σύμβολο: .
Η τελεία συμβολίζει έναν οποιοδήποτε χαρακτήρα.

Παράδειγμα 4: Βρες το "ab", μετά έναν χαρακτήρα και μετά το "c"
κώδικας:
/ab.c/

Σύμβολο: *
Ο αστερίσκος συμβολίζει ένα pattern που επαναλαμβάνεται απο 0 έως άπειρες φορές.

Παράδειγμα 5: Βρες το "a", μετά κανένα ή όσα "b" θέλεις και μετά το "c"
κώδικας:
/ab*c/

Σύμβολο: ?
Ο λατινικό ερωτηματικό συμβολίζει ένα pattern που επαναλαμβάνεται απο 0 έως μία φορές.

Παράδειγμα 6: Βρες το "a", μετά κανένα ή ένα "b" και μετά το "c"
κώδικας:
/ab?c/

Σύμβολο: +
Ο συν συμβολίζει ένα pattern που επαναλαμβάνεται απο μία έως άπειρες φορές.

Παράδειγμα 7: Βρες το "a", μετά ένα ή περισσότερα "b" και μετά το "c"
κώδικας:
/ab+c/

Σύμβολα: { }
Τα άγκιστρα ανοίγουν μία παρένθεση για να βάλουμε ένα εύρος επανάληψης.

Παράδειγμα 8: Βρες το "a", μετά από 2 έως 7 φορές το "b" και μετά το "c"
κώδικας:
/ab{2,7}c/

Το εύρος μπορεί να είναι ανοιχτό, για παράδειγμα {2,} σημαίνει από 2 έως άπειρο. Τα ποιο πάνω σύμβολα * ? + μπορεί να γραφτούν και σαν {0,} {0,1} {1,} αντίστοιχα.

Σύμβολα: [ ]
Οι αγκύλες δηλώνουν μία ομάδα χαρακτήρων.

Παράδειγμα 9: Βρες το "a", μετά έναν από τους χαρακτήρες "d", "e", "f" και μετά το "c"
κώδικας:
/a[def]c/

Για ευκολία μπορούμε να χρησιμοποιούμε την παύλα για να ορίζουμε ομάδες αριθμών ή γραμμάτων. Για παράδειγμα το [a-z] είναι το ίδιο με το να γράψουμε όλα τα μικρά γράμματα του λατινικού αλφαβήτου. Επίσης μπορούμε να κάνουμε συνδυασμούς: [a-zA-Z0-9]. Αυτό όμως σημαίνει οτι η παύλα έχει ιδιαίτερη σημασία μέσα σε αγκύλες. Γι αυτό αν θέλουμε στην ομάδα να συμπεριλάβουμε και την παύλα πρέπει να την βάλουμε είτε στην αρχή είτε στο τέλος: [a-zA-Z0-9-]

Επίσης μέσα στις αγκύλες μπορούμε να πούμε ποιους χαρακτήρες ΔΕΝ θέλουμε. Αυτό το καταφέρνουμε αν για πρώτο χαρακτήρα βάλουμε το ^.

Παράδειγμα 10: Βρες το "a", μετά έναν χαρακτήρα που να μην είναι ο "d", "e", "f" και μετά το "c"
κώδικας:
/a[^def]c/

Σύμβολα: ( )
Οι παρενθέσεις ομαδοποιούν αποτελέσματα που θέλουμε να χρησιμοποιήσουμε. Επίσης ανάλογα με την PHP εντολή μπορούμε να ελέγχουμε το περιεχόμενο ενός pattern.

Παράδειγμα 11: Βρες το "a" μετά κανένα ή όσα "ps" θες και μετά ένα "c"
κώδικας:
/a(ps)*c/

Όμως τι γίνεται αν θέλουμε να χρησιμοποιήσουμε έναν από αυτούς τους ειδικούς χαρακτήρες; Απλά βάζουμε ένα back slash πριν τους γράψουμε.

Παράδειγμα 12: Βρες το "ab*c[123]z"
κώδικας:
/ab\*c\[123\]z/

Υπάρχουν κι άλλοι ειδικοί χαρακτήρες τους οποίους μπορείτε να βρείτε στο PHP Manual αν ψάξετε για "Pattern syntax". Για παράδειγμα το \w συμβολίζει οποιονδήποτε χαρακτήρα γράμμα και το \W οποιονδήποτε μη γράμμα.


Τέλος, υπάρχουν χαρακτήρες που ελέγχουν τον τρόπο χρήσης του pattern από την PHP και μπαίνουν στο τέλος του pattern. Αυτούς τους ονομάζουμε pattern modifiers. Ο πιο χρήσιμος είναι ο i και συμβολίζει οτι το pattern μας δεν είναι case sensitive.

Παράδειγμα 13: Βρες το "abc" είτε είναι γραμμένο με μικρά είτε με κεφαλαία γράμματα
κώδικας:
/abc/i

Μπορείτε να κάνετε άπειρους συνδυασμούς με αυτά τα σύμβολα. Αξίζει να τα μάθετε γιατί χρησιμεύουν πολύ σε δύσκολες στιγμές.

Παράδειγμα 14: Βρες ένα email.
κώδικας:
/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i

Η PHP μας δίνει δύο ομάδες από functions για regular expressions. Τις ereg* και τις preg*. Από αυτές τις δύο στα manual αναφέρεται οτι οι preg* πρέπει να προτιμούνται γιατί είναι ποιο γρήγορες.

Διαβάστε το
http://gr.php.net/manual/en/ref.pcre.php
για περισσότερα για τις αναλύσεις των functions με τα οποία μπορείτε να βρίσκετε ένα ή πολλαπλά ευρήματα από patterns, να κάνετε αλλαγές (replacements) στα strings σας, ή να σπάτε (split) ένα string σε κομμάτια।

Πηγή: http://www.freestuff.gr/forums/viewtopic.php?t=25478

regular expressions for jquery validation



// Αρχίζει απο το ^ και τελειώνει στο $
return this.optional(element) / ^[A-Za-z0-9!@#$%^&*()_]{6,16}$ /i.test(value);



/// Επιτρέπει απο 6 εως 16 χαρακτήρες
$.validator.addMethod("katanalosi",function(value,element){
return this.optional(element) /^[A-Za-z0-9!@#$%^&*()_]{6,16}$/i.test(value);
},"Passwords are 6-16 characters");


/// Ελέγχει σωστό email
$.validator.addMethod("email", function(value, element) {
return this.optional(element) /^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/i.test(value);
}, "Please enter a valid email address.");


/// Δεν επιτρέπονται σύμβολα
$.validator.addMethod("katanalosi", function(value, element) {
return this.optional(element) /^[A-Za-z\d]+$/i.test(value);
}, "Δεν επιτρέπονται σύμβολα.");



/// Ιστοσελίδα με όλα τα Regular για δοκιμή
http://gskinner.com/RegExr/?2ua2e