Προς το περιεχόμενο

MySQL: αντικατάσταση συμβολοσειράς με μεταβλητά μέρη σε ένα column


philos

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Έστω ότι έχουμε το column message σε έναν πίνακα tablename.

Κάποιες εγγραφές του πίνακα έχουν κείμενο (ευνόητο ποια είναι τα μεταβλητά μέρη)  της μορφής:

[ame="https://www.youtube.com/watch?v=GEPvsn6JA_c"]lalala lalalal alala[/ame]

Θα ήθελα να τα κάνω όλα replace, με το εξής αποτέλεσμα:

[MEDIA=youtube]GEPvsn6JA_c[/MEDIA]

Όπως καταλαβαίνετε δεν μας απασχολεί η πληροφορία lalala, ας χαθεί. Μας ενδιαφέρει να πάρουμε το youtube id του video και να το βάλουμε μέσα στο MEDIA bbcode.

Λογικά θέλει regular expression, που ακόμα να τις μάθω :P

Κάθε βοήθεια ευπρόσδεκτη, θα κάνω copy τον πίνακα (backup) για πολλαπλές δοκιμές. ;)

Η σκέψη είναι να γίνει με ένα UPDATE query κι όχι με PHP και loopες. χμμμ

Επεξ/σία από philos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

PHP Loop (που δεν θέλεις)Μετά

$str1 = explode("?v=",$value); 

$str2 = explode("\"",$str1[1]);

$final = '[MEDIA=youtube]'.$str2[0].'[/MEDIA];

Σα νασαι μπακάλης.

Επεξ/σία από Επισκέπτης
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αναζητώ κάτι σε MySQL λύση καθώς μιλάμε για 1000 δες γραμμές και από την άλλη, το πεδίο message δεν έχει μόνο το κείμενο που παρέθεσα αλλά κι άλλο :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Πολύ μπακάλικα δοκιμασε το σε select να δεις αν σου φαίρνει σωστά τα πράγματα πρώτα

 

'[MEDIA=youtube]'+SUBSTRING(message , LOCATE('v=',message ) + 2, LOCATE('"]',message ) -  LOCATE('v=',message ) - 2) + '[/MEDIA]'

 

Επειδή μάλλον δεν παίζει σε mysql το syntax που έγραψα παραπάνω, τσέκαρε εδώ http://sqlfiddle.com/#!9/c1526c/1

 

Επεξ/σία από tolhc1234
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
8 ώρες πριν, tolhc1234 είπε

Πολύ μπακάλικα δοκιμασε το σε select να δεις αν σου φαίρνει σωστά τα πράγματα πρώτα

 

'[MEDIA=youtube]'+SUBSTRING(message , LOCATE('v=',message ) + 2, LOCATE('"]',message ) -  LOCATE('v=',message ) - 2) + '[/MEDIA]'

 

Επειδή μάλλον δεν παίζει σε mysql το syntax που έγραψα παραπάνω, τσέκαρε εδώ http://sqlfiddle.com/#!9/c1526c/1

 

Ευχαριστώ πολύ για την ενασχόληση!! :)

Θα ήθελα να ρωτήσω:

1. Άρα η UPDATE πως μπορεί να συνταχθεί; Θέλουμε να κάνουμε replace (δλδ mysql UPDATE) το πεδίο message ώστε να εναρμονιστούν με τα νέα δεδομένα. Το message μπορεί να έχει και μπόλικο κείμενο μέσα να υπάρχει [ame= μία ή και περισσότερες φορές με μπροστά ή πίσω του άλλο άσχετο κείμενο.

2. Είναι σίγουρα σωστή η σκέψη σου; Ρωτάω γιατί βλέπω μόνο το 'v=' και μπορεί να υπάρχουν youtube links στο πεδίο message, που να μην είναι σε ame bbcode tag. Η ιδέα είναι να αλλάξουμε μόνο τα [ame=

ΥΓ: Όπως καταλαβαίνετε πρόκειται για τον πίνακα των posts ενός forum :P

Επεξ/σία από philos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εάν η βάση δεδομένων είναι MySQL 8.0+ μπορείς να χρησιμοποιήσεις τη function "REGEXP_REPLACE":

UPDATE `tablename` SET `message` = REGEXP_REPLACE(`message`, 'ame="https:\/\/www\.youtube\.com\/watch(.*?)v=(.*?)"(.*?)\/ame', 'MEDIA=youtube]$2[/MEDIA');

Μπορείς να δεις ένα παράδειγμα εδώ.

Spoiler

Το παραθέτω και σαν εικόνα για να υπάρχει:

image.png.d04ca75a64d34b1da60f6ebb8f3c333a.png

  • Like 1
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...