Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

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

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

Απάντηση
Stavros20gr

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Stavros20gr » 08 Ιαν 2013 17:51

Καλησπέρα σε όλους και καλή χρονιά!

Έχω μία βάση δεδομένων σε MySQL και ένα από τα tables αυτής είναι κείμενο (text). Αυτό που θέλω να κάνω είναι να αντικαταστήσω κάποιες από τις λέξεις του κειμένου με hyperlinks σε άλλες σελίδες. Για παράδειγμα, αν μια πρόταση του κειμένου είναι

[...] το αυτοκίνητο τρέχει στην εθνική οδό [...]

θέλω η λέξη αυτοκίνητο να αντικατασταθεί με ένα hyperlink, όπως

<a href="car.gr">αυτοκίνητο</a>. Στο κείμενο θα υπάρχουν αρκετές λέξεις που θα είναι σύνδεσμοι σε άλλες σελίδες.

Έχω ψάξει αρκετά και έχω βρει κάποιες ιδέες αλλά όχι κάποια που να λύνει το πρόβλημά μου. Οπότε ρωτάω κι εδώ σε περίπτωση που έχει κάποιος μια λύση. Δε ζητάω να μου δώσετε οπωσδήποτε την απάντηση, αλλά κάποια βοήθεια αν έχει αντιμετωπίσει κανείς και λύσει αυτό το πρόβλημα.
Οποιαδήποτε βοήθεια είναι καλοδεχούμενη. Αν χρειάζεστε κι άλλες πληροφορίες, ευχαρίστως να σας δώσω. Ευχαριστώ πολύ!

Άβαταρ μέλους
billt
Δημοσιεύσεις: 1175
Εγγραφή: 20 Φεβ 2004 16:17
Τοποθεσία: Θεσσαλονίκη

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από billt » 08 Ιαν 2013 18:31

Η str_replace δε σε καλύπτει;
http://php.net/manual/en/function.str-replace.php

Με αυτο το τρόπο κάνεις την αντικατάσταση αφού τραβήξεις τις προτάσεις από τη βάση

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από fafos » 08 Ιαν 2013 20:25

Sosto to str_replace pou proteinei o Billt alla exei 2 meionekthmata:

1. Otan exeis 2 str_replace opou sto ena exei meros tou prohgoymenou tha parei to teleytaio str_replace.. gia paradeigma exeis ta exhs:

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

$new_text =str_replace&#40;'αυτοκίνητο',"<a href='car.gr'>αυτοκίνητο</a>",$text&#41;;
$new_text =str_replace&#40;'αυτο',"<a href='car1.gr'>αυτο</a>",$text&#41;;
otan vrei sto keimeno thn lexh 'αυτοκίνητο' tha grapsei (you know pou) to 'κίνητο' kai tha kanei link mono to 'αυτο':

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

<a href='car1.gr'>αυτο</a>κινητο
2. An exeis polles lexeis gia antikatastash prepei na exeis arrays kai h str_replace xreiazetai 2 arrays, mia gia tis lexeis pou thes na antikatasthseis kai allh mia me ta string antikatastashs (edo ta links).. poly vavoura

Gi'autous tous logous xrhsimopoiousa kata koron thn strtr()
To mono ths meionekthma oti thelei austhra thn idia lexh antikatastashs (peza, kefalaia, tonous klp):

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

//array me tis lexeis pou psaxno gia na antikatasthso
$words = array&#40;
"αυτοκίνητο"=>"<a href='car.gr'>αυτοκίνητο</a>",
"μηχανάκι"=>"<a href='mixanaki.gr'>μηχανάκι</a>",
"αυτο"=>"<a href='car1.gr'>αυτο</a>"
&#41;;

//keimeno pou tha ginei h antikatastash
$text = 'το αυτοκίνητο τρέχει στην εθνική οδό και προσπερνά ένα μηχανάκι. Μετά από λίγο αυτο έφυγε από τον δρόμο.';

//trexo thn strtr
$new_text =strtr&#40;$text,$words&#41;;

//ektypono
echo $new_text;

...auto tha gyrisei&#58;

το <a href='car.gr'>αυτοκίνητο</a> τρέχει στην εθνική οδό και προσπερνά ένα <a href='mixanaki.gr'>μηχανάκι</a>. Μετά από λίγο <a href='car1.gr'>αυτο</a> έφυγε από τον δρόμο.
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από nirvana » 09 Ιαν 2013 01:18

Μπορείς να το κάνεις και στην mysql κατευθείαν με την REPLACE

Δεν ξέρω κατα πόσον έχει θέμα με ελληνικά (φαντάζομαι δεν θα υπαρχει πρόβλημα).

Παράδειγμα (δεν το εχω τρέξει για να είμαι σίγουρος ότι είναι σωστό συντακτικά)

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

UPDATE my_table SET field1 = REPLACE&#40;field1, 'αυτοκινητο', '<a href='car.gr'>αυτοκίνητο</a>'&#41;

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Apostolis_38 » 09 Ιαν 2013 09:45

Το θέμα που τίθεται είναι το εξής, η λέξη αυτοκίνητο θα πρέπει να αντικαθίσταται πάντα από το a href="car.gr" ή μπορεί και να γίνει a href="car1.gr" - a href="car2.gr" κ.λ.π.
Αν ισχύει η δεύτερη περίπτωση τότε αναγκαστικά κάνεις αντικατάσταση μιας μιας λέξης.
Δεν βλέπω πως μπορείς να δώσεδις στο field να καταλάβει που θέλεις το ένα link και που το άλλο.

Αν ισχύει η πρώτη περίπτωση (όλα τα links θα είναι ίδια) τότε κι εγώ νομίζω οτι η strtr είναι η καλύτερη λύση, απλώς θέλει προσοχή όπως έγραψε κι ο fafos.
Επίσης προσοχή θέλει κατά την καταχώρηση με τυχόν escape characters και κατά την εμφάνιση των εγγραφών για να μην σου τα εμφανίζει σε στύλ

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

<br /><a href="dfdfds">asdas</a>
στην οθόνη.

Άβαταρ μέλους
charavge
Δημοσιεύσεις: 378
Εγγραφή: 14 Σεπ 2006 15:47

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από charavge » 09 Ιαν 2013 11:12

Μου αρέσει αυτό που έγραψε ο fafos. Αντιμετώπιζα ένα θεματάκι με το str_replace, αλλά αυτή η λύση με το array και το strtr είναι πολύ ωραία.

@fafos (offtopic)
fafos έγραψε:Το καλό με την Ελλάδα είναι ότι δεν πρέπει να ανησυχούμε για την καταστροφή του κόσμου το 2012 αφού είμαστε 100 χρόνια πίσω...
Το κακό με την Ελλάδα είναι ότι είμαστε 100 χρόνια πίσω...και είναι σα να έχει έρθει η καταστροφή του κόσμου.

Stavros20gr

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Stavros20gr » 09 Ιαν 2013 12:17

Πολύ καλές ιδέες όλες, ευχαριστώ για τις απαντήσεις!

Θα σας δώσω κάποιες πιο συγκεκριμένες πληροφορίες ώστε να μου πείτε ποια είναι καλύτερη λύση. Το κείμενό μου είναι οργανωμένο στη βάση δεδομένων ανά κεφάλαια, δηλαδή έχει ένα id που αντιστοιχεί στο κεφάλαιο. Θέλω σε όλα αυτά τα κεφάλαια (δηλαδή σε όλο το κείμενο) κάποιες λέξεις να γίνουν hyperlinks. Σε κάθε κεφάλαιο μόνο η πρώτη εμφάνιση της λέξης θα αντικατασταθεί με hyperlink. Ωστόσο στο κεφάλαιο 3 π.χ. θα είναι hyperlink η λέξη "Δίας" ενώ στο κεφάλαιο 5 η λέξη "Διός". Δηλαδή διαφορετικές μορφές του ίδιου ονόματος.

Για το λόγο αυτό πιστεύω ότι είναι καλύτερα να κάνω αντικατάσταση μέσω MySQL και να αλλάξω το κείμενο της ΒΔ, αντί τον τρόπο που εκτυπώνεται. Το δοκίμασα με την UPDATE και την preg_replace. Δηλαδή, παίρνω το κείμενο που θέλω, το περνάω σε ένα array (θέση στον πίνακα<=>κεφάλαιο κειμένου) και για κάθε θέση του array (άρα και κάθε κεφάλαιο) κάνω τις αντικαταστάσεις που θέλω με την preg_replace. Έπειτα με την UPDATE ανανεώνω το κείμενο στη ΒΔ.

Το πρόβλημα που δημιουργήθηκε ήταν όταν έβρισκε απόστροφο στο κείμενο. Αυτό ίσως να ξεπερνιέται κάπως. Πιστεύετε ότι είναι μια καλή λύση αυτή ή πρέπει να το κάνω αλλιώς; Ίσως η str_replace ή η strtr να δουλεύουν καλύτερα από την preg_replace.

Συγνώμη για το μεγάλο μέγεθος αλλά ήθελα να σας δώσω περισσότερες πληροφορίες. Θα δοκιμάσω τις προτάσεις σας και θα ενημερώσω για τυχόν πρόοδο. Και πάλι ευχαριστώ πολύ!

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από jpk » 09 Ιαν 2013 14:06

Άκου μια ακόμα ιδέα &#8230; Λογικά θα έχεις βρεθεί σε site που κάποιες λέξεις ενός άρθρου είναι link κάπου διαφημιστικού ή σχετικής σελίδας . Θα σου πω πως το έκανα εγώ .. .σίγουρα υπάρχουν πολλοί τρόποι &#8230; Χρειαζόμαστε έναν πίνακα links που σίγουρα έχει αν μη τι άλλο την λέξη και το link. Αφού φορτώσουμε αυτά μπορούμε με PHP να αλλάξουμε αυτές τις λέξεις σε links. Μπορούμε να το κάνουμε και πάνω στην βάση με ένα κάπως μπερδεμένο querry αλλά εκεί πρέπει να είμαστε σίγουροι για την απόδοση της βάσης μας σε τέτοια. Σε γενικές γραμμές αυτό που έχω δει εγώ (μπορεί να είναι και λάθος) είναι ότι συμφέρει να το κάνεις προγραμματιστικά. Με τίποτα δεν θα άλλαζα το κείμενο πάνω στον πρωτότυπο πίνακα. Ούτε παραμετροποιημένη είναι μια τέτοια λύση ούτε προσφέρει τίποτα στην διατηρησιμότητα της εφαρμογής. Για να μην αρχίσουμε θεωρητικές ανοησίες &#8230; αυτά είναι απλά μια άποψη αν σου λέει τίποτα κράτα την αν όχι μπορεί και το δικό σου implementation να είναι καλύτερο.

Stavros20gr

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Stavros20gr » 09 Ιαν 2013 14:43

Συμφωνώ ότι είναι καλή ιδέα. Τι γίνεται στη δική μου περίπτωση. Τα links εντός του κειμένου οδηγούν σε άλλες σελίδες που αποτελούν κι αυτές πεδία από tables της ΒΔ. Όμως δεν ανήκουν όλα σε ένα table. Να γίνω πιο σαφής.

Υπάρχει ο πίνακας της ΒΔ με όνομα keimeno. Αυτό είναι το κείμενό μου, χωρισμένο σε κεφάλαια (id=κεφάλαιο). Τα links μπορεί να με οδηγούν σε κάποιο αντικείμενο (πίνακας items) ή σε κάποιο άρθρο (πίνακας articles). Όμως σε κάθε κεφάλαιο κειμένου θέλω μόνο η πρώτη εμφάνιση της λέξης να γίνεται από λέξη hyperlink. Επίσης, σε κάθε κεφάλαιο η λέξη που θέλω να γίνει hyperlink μπορεί να έχει διαφορετική μορφή, για παράδειγμα στο κεφάλαιο 3 να είναι "Δίας" ενώ στο κεφάλαιο 5 να είναι "Διός" (όπως ανέφερα και πριν). Μια υλοποίηση σαν αυτή που προτείνεις θα άλλαζε και τις δύο μορφές και θα τις έκανε hyperlinks. Για αυτό το λόγο σκέφτηκα μήπως είναι προτιμότερο να τρέχω μια φορά κάποια συνάρτηση που θα μου αλλάξει το κείμενο της ΒΔ όπως θέλω (ως διαχειριστής, ο χρήστης δε θα προσπελαύνει αυτή τη συνάρτηση), με διαφορετική παραμετροποίηση για κάθε κεφάλαιο. Δηλαδή θα πρέπει manually να ορίζω για κάθε κεφάλαιο ποια είναι η μορφή της λέξης που θέλω να γίνει hyperlink.

Ομολογώ ότι ίσως δεν είναι η καλύτερη υλοποίηση, προγραμματιστικά μιλώντας, αλλά ενδέχεται να είναι αυτή που ανταποκρίνεται καλύτερα στο πρόβλημά μου.

Μέχρι στιγμής η preg_replace κάνει καλά τη δουλειά, με το μόνο πρόβλημα ότι αν κάποια από τις λέξεις είναι substring άλλης, τότε την αντικαθιστά με το hyperlink. Για παράδειγμα, αν θέλω να αλλάξω τη λέξη "ιερό", αυτή αντικαθιστά το substring "ιερό" της λέξης "ιερός". Αυτό δεν το θέλω. Οπότε πρέπει να κάνω κάποια σύγκριση μόνο για ακριβή αντιστοίχιση λέξης. Αν λυθεί αυτό, θα λύσω το πρόβλημά μου.

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

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Apostolis_38 » 09 Ιαν 2013 16:34

Να σου πω την αλήθεια...αν δεν είναι πολλές οι εγγραφές στον πίνακα κείμενο μπες με phpmyadmin (ή κάτι ανάλογο) και φτιάξε καρφωτά τα links.
Η αν είναι μεγάλα τα κείμενα κάνε export, μορφοποίησε τα με κάποιο άλλο πρόγραμμα και ανεβασέ τα πάλι.

Αλλιώς κράτησε μια ενιαία μορφή στο κείμενο (π.χ. παντού Δίας κι όχι μια Διας, μια Δίας, μια Διάς κ.λ.π. ) και χρησιμοποίησε την strtr.

Και σε κάθε καινούργιο κείμενο χρησιμοποίησε editor ή βάλε με html τα links γύρω απο τη λέξη που θέλεις.
Μου φαίνεται λίγο μπέρδεμα το όλο θέμα για να γίνει αυτοματοποιημένα.

Stavros20gr

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Stavros20gr » 09 Ιαν 2013 16:51

Apostolis_38, αυτό ακριβώς έχω κάνει μέχρι τώρα. Απλά είναι μεγάλα τα κείμενα και θα προσθέσω αρκετά ακόμα, οπότε σκεφτόμουν κάτι πιο αυτοματοποιημένο, όπως λες. Δεν το κόβω να γίνεται, όμως.. :)

Stavros20gr

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Stavros20gr » 10 Ιαν 2013 15:20

Παίδες, μια βοήθεια, αν είναι δυνατόν..

Σκέφτηκα να φτιάξω για κάθε κείμενο δύο νέες στήλες στη ΒΔ, μία με τις λέξεις που θέλω να κάνω hyperlinks και μία με τις σελίδες που θα σε στέλνουν. Έτσι, θα είναι πιο εύκολο να προσθέτω links (ή να τα αλλάζω) και θα εμφανίζονται δυναμικά στη σελίδα μου.

Χρησιμοποιώ τη συνάρτηση preg_replace, ώστε να κάνω χρήση του limit για να μη γίνονται links όλες οι εμφανίσεις μιας λέξης στο κείμενο, αλλά μόνο η πρώτη.

Το πρόβλημα είναι ότι για τη λέξη "ιερό", κάνει link και το αντίστοιχο μέρος της λέξης "ιερός". Δηλαδή δε γίνεται ακριβής αντιστοιχία. Δοκίμασα και το \b που είδα κάπου αλλά και πάλι δε λειτουργεί σωστά; Έχετε κάποια πρόταση για exact match and replace και να μου δίνει τη δυνατότητα για χρήση limit;

Stavros20gr

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Stavros20gr » 10 Ιαν 2013 17:09

Περισσότερες πληροφορίες...

$words: string με τις λέξεις που θέλω να γίνουν hyperlinks
$links: string με τις σελίδες που θα οδηγούν οι παραπάνω λέξεις

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

//κάνω τα string->arrays
$words = explode&#40;", ", $words&#41;;
$links = explode&#40;", ", $links&#41;;

$num_words = sizeof&#40;$words&#41;;

for&#40;$i=0; $i<$num_words; $i++&#41;&#123;
        //μορφοποίηση για τα hyperlinks
	$links&#91;$i&#93; = "<a href='" . $links&#91;$i&#93; . "'>" . $words&#91;$i&#93; . "</a>";

        //μορφοποίηση για τις λέξεις ώστε να εντοπιστούν στο κείμενο
	$words&#91;$i&#93; = "/\b" . $words&#91;$i&#93; . "\b/";
&#125;

//αντικατάσταση στο κείμενο &#40;text&#41; των λέξεων &#40;$words&#41; με τα hyperlinks &#40;$links&#41;
$new_text = preg_replace&#40;$words, $links, $text, 1&#41;;
Για κείμενο γραμμένο στα αγγλικά το παραπάνω δουλεύει. Τις πταίει και δε δουλεύει σωστά στα ελληνικά; Η ΒΔ είναι σε utf8-unicode-ci και η php σελίδα σε utf8, επίσης. Καμία ιδέα;

Stavros20gr

Προσθήκη hyperlinks σε text table μίας MySQL βάσης δεδομένων

Δημοσίευση από Stavros20gr » 12 Ιαν 2013 15:20

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

Στην ουσία η λύση είναι ο κώδικας στο ακριβώς προηγούμενο μήνυμά μου. Το πρόβλημα ήταν ότι δούλευα σε παλιότερη έκδοση του WAMP server και δεν αναγνώριζε το modifier \b. Το δοκίμασα στον Η/Υ του σπιτιού που είχα τη νεότερη έκδοση και όλα καλά. Ξέρω, ηλίθιο ίσως που δεν είχα τελευταία έκδοση, αλλά συνέβη. :roll:

Οπότε, ο κώδικάς μου παίρνει ένα κείμενο (text), μία λίστα λέξεων προς αντικατάσταση (words) και μία λίστα με τις σελίδες που θα στέλνουν οι προηγούμενες λέξεις (links). Αφού κάνω τα words και links arrays, περνάω τα tags <a href> για κάθε link (ώστε να μην τα γράφω πολλές φορές στη ΒΔ) και διαμορφώνω τις λέξεις βάζοντας τους modifiers /, \b και u.

Επειδή το u δεν υπάρχει στον προηγούμενο κώδικα, αυτή είναι η ακριβής μορφή της εντολής:

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

$words&#91;$i&#93; = "/\b" . $words&#91;$i&#93; . "\b/u";
Ο modifier / οριοθετεί τα strings προς αναζήτηση. Το \b στην αρχή και το τέλος είναι word boundary, που σημαίνει ότι δηλώνεις πως κάθε string αντιστοιχεί σε λέξη (δηλαδή ο προηγούμενος και επόμενος χαρακτήρας δεν είναι γράμμα). Τέλος, το u δηλώνει ότι δουλεύουμε σε utf-8 unicode.

Έπειτα, κάνουμε τις αντικαταστάσεις με την preg_replace (δείτε το online manual της php).

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

Απάντηση

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

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

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