2009-11-10 40 views
10

Mam do dopasowania pole w MySQL, dla których myślałem, że mogę użyć wyrażenia regularnego, ale wydaje się, że MySQL nie ma funkcjonalności potrzebnej do wykonania zadania. Oto scenariusz:Czy istnieje odpowiednik MySQL dla PHP preg_replace?

Mam zmienną w PHP o nazwie $ url. Powiedzmy, że ta zmienna jest ustawiona jako ciąg "/ article/my-article/page/2". Mam również tabelę adresów URL w MySQL, z której chciałbym pobrać zawartość. Jednak adresy URL przechowywane w mojej tabeli zawierają znaki wieloznaczne.

Wcześniej miałem tę konfigurację, aby wartość przechowywana w tabeli wyglądała następująco: "/ article /%/page /%".

Z tej konfiguracji, może po prostu uruchomić:

SELECT * FROM urls WHERE '$url' LIKE url 

I to będzie pasować, co jest pożądaną funkcjonalność.

Co chciałbym teraz zrobić, to pozwolić na bardziej zaawansowany znak wieloznaczny, taki, że zamiast "/ article /%/page /%", moje dane MySQL mogą być "/ article/{{slug}}/strona/{{page_no}} ".

Chcę utworzyć zapytanie SQL, które będzie pasować do tych danych, używając tego samego wejścia $ url. LIKE nie jest już poprawnym porównaniem, ponieważ nie używam wbudowanego symbolu wieloznacznego "%", ale raczej {{. *}}. Jakieś pomysły, jak to osiągnąć?

Odpowiedz

-1

Znalazłem rozwiązanie. To nie jest idealne, ale wstawię to tutaj, na wypadek, gdyby czyste rozwiązanie SQL nigdy się nie wyświetlało. Mogę pozostawić pole URL w MySQL równe "/ articles /%/page /%" i dodać kolejne pole o nazwie zmienne, które przechowuje listę nazw zmiennych, które mają być używane. W ten sposób mogę użyć mojego pierwotnego zapytania, a następnie zastąpić znaki "%" w zwracanej wartości przez "{{variable}}" w PHP sprintf po pobraniu danych.

Nadal chciałbym, aby to rozwiązano w SQL, jeśli to możliwe, ponieważ uważam, że koncepcja jest cenna.

4

Brzmi to, co chcesz zrobić, to mieć nową składnię w bazie danych, gdzie adresy URL zastępcze chcesz przekazać do Twój kod zastępczy zmienny oparty na php (sprintf), ale nadal możesz wykonywać oryginalne porównania, aby dopasować adres URL.

Jeśli dobrze rozumiem, chcesz mieć nowy format URL

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

i dopasować go przed czymś jak

/article/my-article/page/2 

preg wtyczki Sagi wymienić można zrobić podstawienie co potrzeba, co będzie zmień jeden z nowo sformatowanych adresów URL na oryginalny format użyty do określenia dopasowania za pomocą składni LIKE.Następujące zapytanie:

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

postawi nowy adres URL (/ article/{{ślimak}}/strona/{{page_no}}) do tego, co było pierwotnie

/article/%/page/% 

które następnie mogą być zawraca poprzez pierwotnym zapytaniu, coś takiego:

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

Niektóre dystrybucje binarne jak MAMP, XAMMP etc mieć plugin już zainstalowany, ale nie jest on zainstalowany na wielu systemach, takich jak DarwinPorts/Ubuntu. Oto kilka artykułów dotyczących instalacji wtyczki preg. Mam nadzieję, że to pomoże.

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

To jest poprawna odpowiedź. – dotancohen

3

Użytkownik Sagi powyżej wspomina http://www.mysqludf.org/lib_mysqludf_preg/ ale jak to odpowiedź jest bardzo stary jak większość tutoriali, chciałem rozszerzyć na to przez wzgląd na przybyłych na to pytanie .

Po pierwsze, biblioteka jest naprawdę wielki i mówiąc z doświadczenia mogę powiedzieć, że wydaje się być utrzymane i nadal działa bez zarzutu w 2015

Aby uzyskać to zainstalowane i działa, mogę tylko znaleźć jakiś bardzo stary tutoriale więc myślałem, że dzielić to, co zrobiłem, że pracował dla mnie zainstalowanie najnowszej stabilnej wersji (v1.1) na 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 

Powinieneś mieć teraz wszystkie następujące funkcje dostępne dla Ciebie:

lib_mysqludf_preg_info 
preg_capture 
preg_check 
preg_replace 
preg_rlike 
preg_position 
+0

Istnieje również niezły zestaw instrukcji instalacji w dokumencie INSTALL Github na https://github.com/mysqludf/lib_mysqludf_preg/blob/testing/INSTALL – Slam

0

Począwszy od MySQL 5.5, można użyć RLIKE:

  • albo przechowywać url w REGEXP stylu i zapytania z

    select * from adresy URL '$ url' RLIKE url;

  • lub utrzymać ją w podobny stylu, i dokonać wymiany (w% *, _ o..):

    SELECT * FROM adresy URL '$ url' RLIKE REPLACE (Replace (URL " % ','. * '),' _ ','. ');

    Żeby być kompletnym, musiałbyś wykonać inne zamienniki dla znaków escape, które są znaczące z regexp:? \() [] ... (patrz funkcja php preg_quote)

Powiązane problemy