Δύσκολα regexes

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

Δύσκολα regexes

Δημοσίευση από alkisg » 19 Απρ 2006 10:41

Μπορεί κανείς να βρει λύση στο παρακάτω πρόβλημα;

Έχουμε ένα κομμάτι κώδικα στα ελληνικά, π.χ.
Για ι από 1 μέχρι 10
Γράψε 'Αυτό είναι σταθερά-αλφαριθμητικό'
τέλος_επανάληψης !Αυτό είναι σχόλιο

και θέλουμε να το χρωματίσουμε με php, δηλαδή να παρεμβάλουμε <font color=...> στα κατάλληλα σημεία χρησιμοποιώντας regexes.
Είναι εύκολο να γίνουν match τα σταθερά αλφαριθμητικά ('***') και επίσης τα σχόλια (!*** ως το τέλος γραμμής).

Το δύσκολο είναι ότι μπορεί να είναι εμφωλευμένα το ένα μέσα στο άλλο, οπότε και θα πρέπει να χρωματιστεί μόνο το πιο εξωτερικό από τα δύο:
'Αλφαριθμητικό με !σχόλιο που δεν πρέπει να χρωματιστεί'
!σχόλιο με 'αλφαριθμητικό' που δεν πρέπει να χρωματιστεί

Καμιά ιδέα για regex που να ξεχωρίζει τα παραπάνω;

Παράδειγμα στο http://users.sch.gr/alkisg/tosteki/inde ... 02#msg2602 όπου το έφτιαξα με parsing αντί για regexes...

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Δύσκολα regexes

Δημοσίευση από cpulse » 20 Απρ 2006 03:27

Είναι λίγο περασμένη η ώρα... αλλά αυτό εδώ νομίζω θα κάνει κάτι...

^([^']*'[^']*')*([^'!]*)?(\!.*)?$

Το τρίτο match είναι το comment.

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Δύσκολα regexes

Δημοσίευση από skeftomilos » 20 Απρ 2006 04:07

Εκτός θέματος, αλλά δε μπορώ να κρατηθώ. :P

Κώδικας: Επιλογή όλων

<html>
  <head>
    <script type="text/javascript">
      window.onload = function&#40;&#41; &#123;
        var source = document.getElementById&#40;'source'&#41;.value
        var output = source.replace&#40;/&#40;'&#91;^'&#93;*'&#41;|&#40;!.*&#41;|&#40;\d+&#41;/g, function&#40;$0, $1, $2, $3&#41; &#123;
          var color = &#40;$1 && 'red'&#41; ||
                      &#40;$2 && 'green'&#41; ||
                      &#40;$3 && 'blue'&#41;
          return '<span style="color&#58;' + color + '">' + $0 + '</span>'
        &#125;&#41;
        document.getElementById&#40;'output'&#41;.innerHTML = output.replace&#40;/\n/g, '<br>'&#41;
      &#125;
    </script>
  </head>
  <body>
    <textarea id="source" cols=80 rows=10>
Για ι από 1 μέχρι 10
Γράψε 'Αυτό είναι σταθερά-αλφαριθμητικό'
τέλος_επανάληψης !Αυτό είναι σχόλιο
'Αλφαριθμητικό με !σχόλιο που δεν πρέπει να χρωματιστεί'
!σχόλιο με 'αλφαριθμητικό' που δεν πρέπει να χρωματιστεί
    </textarea>
    <pre id="output">
    </pre>
  </body>
</html>
- Live Demo
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

Δύσκολα regexes

Δημοσίευση από alkisg » 20 Απρ 2006 19:14

Παπαπα ο Χριστός κι η Παναγιά... :o
Τα σώζω και τα δυο για offline μελέτη κι επανέρχομαι!

skeftomile κάποιος πρέπει να σου κάνει ένα tutorial για δομημένο προγραμματισμό, δεν είναι πράγματα αυτά να πετάς function definition στη μέση της κλήσης για αντικατάσταση regular expression! :hammer: :lol:

Thanks!

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Δύσκολα regexes

Δημοσίευση από skeftomilos » 20 Απρ 2006 23:23

Καλά ντε πώς κάνεις έτσι. Δυο nested lambda functions βάλαμε λόγω των εορτών, ούτε κόκκινες τις βάψαμε ούτε τις τσουγκρίσαμε. :)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

Δύσκολα regexes

Δημοσίευση από panosru » 23 Απρ 2006 13:06

giati re c alkisg emena poio poly m' aresei aytos o tropos! xD eksalou me ta tuts tou skeftomilou kai ego etsi grafo tora kai me boleyei xD (asxeta an den boleyei tous allous :lol: :lol:)

Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

Δύσκολα regexes

Δημοσίευση από alkisg » 23 Απρ 2006 22:41

Ναι βρε panosru πλάκα έκανα... Απλά δεν τις έχω συνηθίσει και μου πήρε μερικά δευτερόλεπτα μέχρι να συνειδητοποιήσω τι ήταν αυτό που έβλεπαν τα μάτια μου!!! :)

Πάντως (ανεξάρτητα από closures, lambda functions και τα συναφή) υπάρχει ένα όριο στον συμπτυγμένο προγραμματισμό: από κάποιο σημείο και μετά είναι καλύτερα να διαβάζεις 10 γραμμές παραπάνω "απλού" κώδικα παρά να τρως μερικά λεπτά για να καταλάβεις τι κάνει μια γραμμή!

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Δύσκολα regexes

Δημοσίευση από skeftomilos » 24 Απρ 2006 02:25

Ένα σχολιάκι μια και το έφερε η κουβέντα. Έχω την αίσθηση ότι υπάρχει μια συγκρατημένη τάση προς την κατεύθυνση του functional προγραμματισμού. Όχι πως ο κόσμος λάτρεψε ξαφνικά τις Lisp, Scheme και Haskell, αλλά ότι οι υπόλοιπες γλώσσες ενσωματώνουν η μία μετά την άλλη κάποια funtional χαρακτηριστικά. Παράδειγμα ο παρακάτω κώδικας Ruby:

Κώδικας: Επιλογή όλων

a = %w&#40; ant bee cat dog elk &#41;    # create an array
a.each &#123; |animal| puts animal &#125;  # iterate over the contents
Άλλο παράδειγμα η δυνατότητα για ανώνυμα delegates που απέκτησε η C# στην έκδοση 2.0 (πέρσι δηλαδή):

Κώδικας: Επιλογή όλων

void StartThread&#40;&#41; &#123;
  System.Threading.Thread t1 = new System.Threading.Thread&#40;delegate&#40;&#41; &#123;
    System.Console.WriteLine&#40;"Hello World!"&#41;;
  &#125;&#41;;
  t1.Start&#40;&#41;;
&#125;
Η JavaScript υποστηρίζει ανώνυμες functions από την έκδοση 1.2, δηλαδή εδώ και πολύ καιρό.

Η PHP τι κάνει ΟΕΟ; Υπάρχει καμιά πρακτική χρησιμότητα για το παρακάτω;

Κώδικας: Επιλογή όλων

<?php
$newfunc = create_function&#40;'$a,$b', 'return "ln&#40;$a&#41; + ln&#40;$b&#41; = " . log&#40;$a * $b&#41;;'&#41;;
echo "New anonymous function&#58; $newfunc\n";
echo $newfunc&#40;2, M_E&#41; . "\n";
// outputs
// New anonymous function&#58; lambda_1
// ln&#40;2&#41; + ln&#40;2.718281828459&#41; = 1.6931471805599
?>
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Δύσκολα regexes

Δημοσίευση από cpulse » 24 Απρ 2006 11:19

Ό,τι κι αν φας στο τέλος όλα γίνονται πολτός και καταλήγουν στο έντερο... τι lamda functions και τέτοια.. όλα καταλήγουν σε opcodes και τελικά σε machine code. Η μόνη χρησιμότητα που βρίσκω είναι ο οπτικά λιγότερος κώδικας.

Πάντως αυτό το create_function skeftomilε δεν το ήξερα.. ωραίο..
Μου θύμισε κάτι χρόνια πίσω που έτυχε να φτιάξω ένα πρόγραμμα για ένα ταμείο του δημοσίου. Κάθε υπάλληλος είχε διαφορετικές κρατήσεις και επιδόματα... τα οποία δεν ήταν όλα σταθερά ποσά. Κάποια κλιμακωτά, κάποια σταθερά, κάποια αναλογικά .. γραφειοκρατία unanistan. Τους είχα φτιάξει μια ειδική mini scritoγλώσσα και ειδικό script για τον κάθε υπάλληλο! :o

Ή θα μπορούσε να το χρησιμοποιήσει κάποιος και για one time pads :)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης