2009-11-10 19 views
10

Ho una corrispondenza con un campo in MySQL, per cui ho pensato che potrei usare un'espressione regolare, ma sembra che MySQL non abbia la funzionalità di cui ho bisogno per fare il lavoro. Ecco lo scenario:Esiste un equivalente MySQL del preg_replace di PHP?

Ho una variabile in PHP chiamata $ url. Diciamo che questa variabile è impostata come la stringa "/ article/my-article/page/2". Ho anche una tabella di URL in MySQL da cui vorrei estrarre il contenuto. Gli URL memorizzati nella mia tabella, tuttavia, includono caratteri jolly.

In precedenza, ho avuto questo set up in modo che il valore memorizzato nella tabella fosse simile a questo: "/ article /%/page /%".

Con tale configurazione, ho potuto solo correre:

SELECT * FROM urls WHERE '$url' LIKE url 

E questo sarebbe partita, che è la funzionalità desiderata.

Quello che mi piacerebbe fare ora, è consentire un carattere jolly più avanzato, in modo che invece di "/ article /%/page /%", i miei dati MySQL potrebbero essere "/ article/{{slug}}/pagina/{{page_no}}".

Desidero creare una query SQL che corrisponda a questi dati, utilizzando lo stesso input $ url. LIKE non è più il confronto corretto, dal momento che non sto usando il carattere jolly "%" incorporato, ma piuttosto {{. *}}. Qualche idea su come realizzare questo?

risposta

-1

Ho trovato una soluzione. Non è l'ideale, ma lo inserirò qui nel caso in cui una soluzione SQL pura non emerga mai. Posso lasciare il campo url in MySQL uguale a "/ articles /%/page /%" e aggiungere un altro campo chiamato variabili che memorizza un elenco di nomi di variabili da utilizzare. In questo modo posso usare la mia query originale, quindi sostituire i caratteri "%" nel valore restituito con "{{variable}}" in PHP con sprintf dopo che ho recuperato i dati.

Ancora, mi piacerebbe vedere risolto questo in SQL, se possibile, dal momento che penso che il concetto è prezioso.

4

Sembra che ciò che si vuole fare è avere la nuova sintassi nel database in cui gli URL sono segnaposti si passerebbe a il tuo codice di sostituzione variabile basato su php (sprintf), ma puoi comunque eseguire i confronti originali per abbinare l'URL.

se ho capito bene si vuole prendere un nuovo formato di URL

/article/{{slug}}/page/{{page_no}} 

e abbinare contro qualcosa come

/article/my-article/page/2 

Il pregnenolone plug Sagi menzionato può fare la sostituzione è necessario, che sarà trasforma uno degli URL appena formattati nel formato originale che hai usato per determinare la corrispondenza usando la sintassi LIKE.La seguente query:

SELECT PREG_REPLACE('/({{.*?}})/', '%', `url`) FROM urls; 

si trasformerebbe il nuovo URL (/ article/{{slug}}/page/{{page_no}}) in quello che era in origine

/article/%/page/% 

che possono poi essere alimentato indietro con la vostra query originale, qualcosa di simile:

SELECT * FROM urls 
WHERE '/article/my-article/page/2' LIKE preg_replace('/({{.*?}})/', '%', `url`); 

Alcune distribuzioni binarie come MAMP, XAMMP ecc hanno il plugin già installato, ma non è installato su un sacco di sistemi come MacPorts/Ubuntu. Qui ci sono un paio di articoli sull'installazione del plugin preg. Spero che sia d'aiuto.

http://quickshiftin.com/blog/2011/04/installing-mysql-preg-plugin-osx-macports/

http://quickshiftin.com/blog/2011/12/installing-the-mysql-preg-plugin-on-ubuntu-with-apt-get/

+1

Questa è la risposta corretta. – dotancohen

3

L'utente Sagi sopra menziona http://www.mysqludf.org/lib_mysqludf_preg/ ma questa risposta è molto antica come la maggior parte dei tutorial, ho voluto approfondire questo per il bene dei nuovi arrivati ​​a questa domanda .

In primo luogo, la biblioteca è davvero grande e parlando per esperienza posso dire che sembra essere stata mantenuta e sta ancora lavorando in modo impeccabile nel 2015.

Per farlo installato e funzionante, ho potuto trovare solo alcuni molto datato tutorial così ho pensato di condividere quello che ho fatto che ha funzionato per me l'installazione di ultima release stabile (v1.1) su Ubuntu 14.04:

apt-get update 
apt-get install libpcre3-dev libmysqlclient-dev build-essential libmysqld-dev libpcre3-dev 
wget https://github.com/mysqludf/lib_mysqludf_preg/archive/lib_mysqludf_preg-1.1.tar.gz 
tar -xzf lib_mysqludf_preg-1.1.tar.gz 
cd lib_mysqludf_preg-1.1 
./configure 
make install 
make installdb 
service mysql restart 

ora dovreste avere tutte le seguenti funzioni a vostra disposizione:

lib_mysqludf_preg_info 
preg_capture 
preg_check 
preg_replace 
preg_rlike 
preg_position 
+0

C'è anche un bel set di istruzioni per l'installazione sul documento github INSTALL all'indirizzo https://github.com/mysqludf/lib_mysqludf_preg/blob/testing/INSTALL – Slam

0

A partire da MySQL 5.5, è possibile utilizzare RLIKE:

  • o negozio url nella REGEXP-stile, e query con

    SELECT * FROM url dove '$ url' RLIKE url;

  • o tenerlo in LIKE-stile, e fare una sostituzione (% in *, _ per..):

    SELECT * FROM url dove '$ url' RLIKE REPLACE (REPLACE (url, ' % ','. * '),' _ ','. ');

    Per essere completo, è necessario eseguire altre sostituzioni per evitare caratteri significativi in ​​termini di regexp:? \() [] ... (vedere la funzione php preg_quote)

Problemi correlati