Πρόβλημα με regular expression match

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

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

Απάντηση
Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

Πρόβλημα με regular expression match

Δημοσίευση από iffor » 14 Σεπ 2006 18:38

Καλησπερούδια!!!

Θα μπορούσε να μου εξηγήσει κάποιος τι πάει στραβά με τον παρακάτω κώδικα?

Είχα στην αρχή τον εξής κώδικα

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

$regex = '#\[LINK siteid="(.*?)" urlid="(.*?)" linktext="(.*?)"\]#s';
$mailing->list_content = preg_replace_callback( $regex, 'replaceLinkTagWithHtmlLink', $mailing->list_content );

function replaceLinkTagWithHtmlLink(&$matches){
  
  $siteid = intval($matches[1]);
  $urlid = intval($matches[2]);
  $lnktext = $matches[3];
  
  if($siteid != 0 && $urlid != 0 && !empty($lnktext)){
    return '<a href="index.php?siteid='. $siteid .'&urlid=' . $urlid . '" target="_blank">' . $lnktext . '</a>';
  &#125;
&#125;
όπου $mailing->list_content το κείμενο από την βαση.

ο οποίος αντικαθηστούσε το πχ [LINK siteid="1" urlid="5" linktext="LinkText"], εξαγώμενο από βάση, με το ανάλογο link όπως φαίνεται και στην function.

Στην προσπάθειά μου να προσθέσω κάτι επιπλέον στο όλο σκηνικό, δηλ στο
[LINK siteid="1" urlid="5" linktext="LinkText"] να προσθέτο επιπλέον στοιχεία και να γινει
[LINK siteid="1" urlid="5" linktext="LinkText" linkclass="LinkClass"], βρήκα τα σκούρα...

Κατ' αρχάς, στις εγγραφές μου μέσα στην βάση τις άλλαξα βάζοντας το ανάλογο linkclass="LinkClass"

και μετά τον παραπάνω κώδικα τον άλλαξα σε

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

$regex = '#\&#91;LINK siteid="&#40;.*?&#41;" urlid="&#40;.*?&#41;" linktext="&#40;.*?&#41;" linkclass="&#40;.*?&#41;"\&#93;#s';
$mailing->list_content = preg_replace_callback&#40; $regex, 'replaceLinkTagWithHtmlLink', $mailing->list_content &#41;;

function replaceLinkTagWithHtmlLink&#40;&$matches&#41;&#123;
  
  $siteid = intval&#40;$matches&#91;1&#93;&#41;;
  $urlid = intval&#40;$matches&#91;2&#93;&#41;;
  $lnktext = $matches&#91;3&#93;;
  $lnkclass = $matches&#91;4&#93;;
  
  if&#40;$siteid != 0 && $urlid != 0 && !empty&#40;$lnktext&#41;&#41;&#123;
    return '<a href="index.php?siteid='. $siteid .'&urlid=' . $urlid . '" target="_blank" class="'.$lnkclass.'">' . $lnktext . '</a>';
  &#125;
&#125;
Ωστόσο, με την παραπάνω μόντα, δεν βρήσκει η preg_replace_callback το ανάλογο patern με αποτέλεσμα να μην γίνεται η αλλαγη...
Στην βάση, σίγουρα οι εγγραφές έχουν την μορφή [LINK siteid="##" urlid="##" linktext="LinkText" linkclass="LinkClass"]

Έχω κάνει κάποιο λάθος στην $regex?!?!?

Οποιαδήποτε βοήθεια!!! Thanx!!!
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

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

Πρόβλημα με regular expression match

Δημοσίευση από cpulse » 14 Σεπ 2006 20:32

Νομίζω οτι δεν δέχεται δύο control characters στην σειρά .. το * και ?

Καλύτερα κάντω έτσι:

$regex = '#\[LINK siteid="([^"])" urlid="([^"])" linktext="([^"])"\]#s';

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

Πρόβλημα με regular expression match

Δημοσίευση από cpulse » 15 Σεπ 2006 02:35

οοοοοπαα...

$regex = '#\[LINK siteid="([^"]*)" urlid="([^"]*)" linktext="([^"]*)"\]#s';

:)

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

Πρόβλημα με regular expression match

Δημοσίευση από iffor » 15 Σεπ 2006 10:39

cpulse έγραψε:Νομίζω οτι δεν δέχεται δύο control characters στην σειρά .. το * και ?

Καλύτερα κάντω έτσι:

$regex = '#\[LINK siteid="([^"])" urlid="([^"])" linktext="([^"])"\]#s';
Thanx φίλε μου για την απάντηση!!!
Δυστυχώς, κανονικά τα δέχεται τα 2 control characters στην σειρά!!!
Το λέω αυτό γιατί αν πρόσεξες, στον πρώτο κώδικα που έδωσα ( που είναι από το YANC )
δουλεύει κανονικότατα... δεν ξέρω όμως που κολλάει όταν προσθέτω, τον αθώο κατα την άποψη μου, επιπλέον κώδικα...

Μου έφαγε εχθές πολλές ώρες και θα μου φάει και σήμερα, μιας και δεν μου έρχεται στο μυαλό τι μπορεί να κάνω τόσο λάθος....

Thanx και πάλι man!!! :wink:
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

nastis
Δημοσιεύσεις: 124
Εγγραφή: 16 Φεβ 2005 16:28
Επικοινωνία:

Πρόβλημα με regular expression match

Δημοσίευση από nastis » 15 Σεπ 2006 12:07

Ιδέα για debugging.

Μήπως να δοκίμαζες να το κάνεις σε δύο στάδια(στην προσπάθεια να εντοπίσεις το λάθος)
Δηλαδή πέρνα το πρώτα το αρχικό sciptaki
και μετα κάνε function μόνο για το linkclass="LinkClass".
Αμα δουλέψει δοκίμασε το και αντίστροφα πρώτα class μετά τα υπόλοιπα.
κάνε κανα echo να δείς μπας και σου αντικαταστεί τίποτα άλλο αντί αυτού που θέλεις.
Θα υπέθετα ότι είναι στο format των links σου που παίρνει από την βαση.

Β.
www.oktonia.com - Παγκόσμιο Χωριό Γνώσης Λυμένα Θέματα Εξετάσεων - Ασκήσεις

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

Πρόβλημα με regular expression match

Δημοσίευση από cpulse » 15 Σεπ 2006 13:31

Έκανα ένα test, έβαλα ένα print_r($matches) μέσα στο replaceLinkTagWithHtmlLink() για να δω τι γίνεται και έκανα comment out το if μέσα στο replaceLinkTagWithHtmlLink() για να μην έχω περιορισμούς. Αν το κάνεις κι εσύ θα δεις οτι το 4ο match δεν βγαίνει. Όμως αν βγάλεις το ερωτηματικό από regexp σου βγαίνει μια χαρά. Τώρα αν πάλι δεν βγαίνουν αποτελέσματα ίσως να είναι λόγο του if($siteid != 0 && $urlid != 0 && !empty($lnktext)) .

Οπότε δοκίμασε το έτσι:
$regex = '#\[LINK siteid="(.*)" urlid="(.*)" linktext="(.*)" linkclass="(.*)"\]#s';

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

Πρόβλημα με regular expression match

Δημοσίευση από cpulse » 15 Σεπ 2006 13:36

Αν κάποια από τα δεδομένα σου έχουν linkclass και κάποια όχι.. τότε βάλε το όλο μαζι σε ερωτηματικό:

$regex = '#\[LINK siteid="(.*)" urlid="(.*)" linktext="(.*)"( linkclass="(.*)")?\]#s';

απλά με αυτή την αλλάγη γίνεται ανακατάταξη στα match ids

Άβαταρ μέλους
iffor
Δημοσιεύσεις: 778
Εγγραφή: 14 Μάιος 2005 01:19
Τοποθεσία: Παράδεισος
Επικοινωνία:

Πρόβλημα με regular expression match

Δημοσίευση από iffor » 15 Σεπ 2006 14:07

Thanx φίλε!!!
Το $regex εντάξη ήταν!!!
Το πρόβλημα ήταν εκεί που δεν το περίμενα να σου πω την αλήθεια!!!

Καθώς μετέτρεπα τα αρχικά [LINK] σε εκείνα με το linkclass μέσα και από τον webbased editor,
αλλά κάι μέσω του phpMyAdmin, πρόσεξα ( και δεν έχω ιδέα γιατί!!! ) ότι μετά από το linktext
αντί για κενό, έβαζε unix αλλαγή γραμμής ( \r\n, \r, \n ) με αποτέλεσμα να μην το διαβάζει
σωστά μετά η preg_replace_callback... Σηκώνω τα χέρια ψηλά γιατί έχει αυτή την συμπεριφορά...

Αυτό που έκανα τελικά ήταν πριν καλέσω την preg_replace_callback, να περάσω το κείμενο ως εξής

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

$mailing->list_content = preg_replace&#40;"/\r\n|\n|\r/", " ", $mailing->list_content&#41;;
και μετά

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

$mailing->list_content = preg_replace_callback&#40; $regex, 'replaceLinkTagWithHtmlLink', $mailing->list_content &#41;;
Μετά από αυτό δουλεύει...
Αλλά θα μου μείνει η απορία, πως πέρασαν τα \r\n αντί του space... Τέσπα...

Thanx και πάλι!!! :wink:
μια νέα αρχή ξεκίνησε...
ένας καινούριος δρόμος άνοιξε...
redpanda.gr

Απάντηση

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

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

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