MySQL: Αναζήτηση σε json column (χωρίς JSON_CONTAINS) / PHP: Πρόβλημα κανονικής παράστασης

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

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

Απάντηση
Άβαταρ μέλους
philos
Δημοσιεύσεις: 264
Εγγραφή: 30 Αύγ 2007 23:32

MySQL: Αναζήτηση σε json column (χωρίς JSON_CONTAINS) / PHP: Πρόβλημα κανονικής παράστασης

Δημοσίευση από philos » 16 Ιαν 2018 18:45

Έχω δύο θεματάκια προς αντιμετώπιση :)

Όποιος μπορεί να με διαφωτίσει έστω για ένα, ευχαριστώ εκ των προτέρων!

Α) Έχουμε ένα column σε MySQL πίνακα (MariaDB βασικά), το οποίο έχει json δεδομένα. Παράδειγμα:

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

{"message":"Phone number information as of 2018-01-05 19:52:25 UTC","type":"cellphone","provider":"Vodafone","ported":false,"success":true}
Ξέρω, δεν είναι και ό,τι πιο κανονικοποιημένο, αλλά ο server τρέχει MariaDB < 10.2.3 συνεπώς δεν είναι διαθέσιμη η JSON_CONTAINS αυτή τη στιγμή. :)

Το ζητούμενο: θέλουμε να κάνουμε αναζήτηση βάσει provider σε αυτό το column. Είχα γράψει αυτό, με το query στο $searchprovider:

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

AND (phone_info LIKE '%\"provider\":\"". $db->escape_string($searchprovider) ."\"%')
Δουλεύει, όμως:
- αντιμετωπίζει προβλήματα σε περιπτώσεις που υπάρχουν > από μία λέξεις (πχ για query "Vodafone" θα δουλέψει σίγουρα)
- αν υπάρχουν παρενθέσεις στον provider, πχ: "provider":"RCS \u0026 RDS (Digi)", δεν βρίσκεται αποτέλεσμα.

Καμιά ιδέα;


Β) Σε μια μεταβλητή $bbcode, έχουμε κείμενο με κώδικα BBCODE, που προσεσσάρεται για να αντικατασταθούν οι εικόνες ( [ img ] tags) σε html (<img src= κτλ):

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

$bbcode = preg_replace('#\[img\]\s*(https?://([^*\r\n]+|[a-z0-9/\\._\- !]+))\[/img\]#iUe', "\$this->handle_bbcode_img_match('\\1')", $bbcode);

...με:

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

	function handle_bbcode_img_match($link, $fullsize = false)
	{
		// remove double spaces -- fixes issues with wordwrap
		$link = str_replace(array('  ', '"'), '', $link);

		$retval = ($fullsize ? '<div class="size_fullsize">' : '')  . '<img src="' .  $link . '" border="0" alt="" />' . ($fullsize ? '</div>' : '');

		return $retval;
	}
Το θέμα: πρέπει κάπως να αλλάξει ο κώδικας $bbcode = preg_replace ή και η callback function, ώστε:

α) οι καθαρές εικόνες
[img ]link[ /img]

...να προσεσσάρονται με έναν Α τρόπο (τιμή html στη $retval)

β) οι εικόνες που εσωκλείονται σε url:
[url = "www.google.gr" ][img ]link[ /url][ /url]

... να προσεσσάρονται με Β τρόπο (άλλη $retval)

Δυστυχώς δεν ξέρω κανονικές παραστάσεις ώστε να προσαρμόσω τη preg_replace και δυσκολεύομαι ακόμα και με συμφραζόμενα να βγάλω σωστό αποτέλεσμα...

(ΥΓ: Έβαλα κενά τα img και url tags γιατί δεν τα πρόβαλλε σωστά η φόρμα εδώ ;) )


Ευχαριστώ και πάλι!

Απάντηση

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

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

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