Есть ли MySQL эквивалент PHP preg_replace? - PullRequest
12 голосов
/ 10 ноября 2009

У меня есть поле для сопоставления с полем в MySQL, для которого я думал, что мог бы использовать регулярное выражение, но похоже, что MySQL не обладает той функциональностью, которая мне необходима для выполнения этой работы. Вот сценарий:

У меня в PHP есть переменная с именем $ url. Допустим, эта переменная установлена ​​в виде строки "/ article / my-article / page / 2". У меня также есть таблица URL в MySQL, из которой я хотел бы получить контент. Однако URL-адреса, хранящиеся в моей таблице, включают в себя подстановочные знаки.

Ранее я настроил это так, чтобы значение, хранящееся в таблице, выглядело так: "/article/%/page/%".

С этой конфигурацией я мог просто запустить:

SELECT * FROM urls WHERE '$url' LIKE url

И это будет соответствовать, что является желаемой функциональностью.

Что я хотел бы сейчас сделать, так это разрешить использование более продвинутого подстановочного знака, чтобы вместо «/ article /% / page /%» мои данные MySQL могли быть «/ article / {{slug}} / page» /{{page_no}}".

Я хочу создать SQL-запрос, который будет соответствовать этим данным, используя тот же ввод $ url. LIKE больше не является правильным сравнением, поскольку я не использую встроенный подстановочный знак «%», а {{. *}}. Есть идеи как это сделать?

Ответы [ 5 ]

6 голосов
/ 31 июля 2011

Существует библиотека пользовательских функций, которая дает вам preg_replace в MySQL: http://www.mysqludf.org/lib_mysqludf_preg/

4 голосов
/ 04 декабря 2011

Похоже, вам нужно иметь новый синтаксис в базе данных, где URL-адреса содержат заполнители, которые вы передадите в код замены переменных на основе php (sprintf), но при этом сможете выполнять исходные сравнения, чтобы соответствовать URL.

Если я правильно понимаю, вы хотите использовать новый формат URL

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

и сопоставьте его с чем-то вроде

/article/my-article/page/2

Упомянутые саги preg plugin могут выполнить необходимую замену, которая превратит один из ваших недавно отформатированных URL в исходный формат, который вы использовали для определения соответствия с использованием синтаксиса LIKE. Следующий запрос:

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

Превратит новый URL (/ article / {{slug}} / page / {{page_no}}) в исходное значение

/article/%/page/%

, который затем может быть возвращен через ваш исходный запрос, примерно так:

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

В некоторых бинарных дистрибутивах, таких как MAMP, XAMMP и т. Д., Плагин уже установлен, но он не установлен на многих системах, таких как Macports / Ubuntu. Вот пара статей об установке плагина preg. Надеюсь, это поможет.

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/

3 голосов
/ 07 апреля 2015

Пользователь sagi выше упоминает http://www.mysqludf.org/lib_mysqludf_preg/, но так как этот ответ очень старый, как и большинство учебных пособий, я хотел бы остановиться на этом ради новичков в этом вопросе.

Во-первых, библиотека действительно великолепна, и, исходя из опыта, могу сказать, что она, кажется, сохранилась и до сих пор работает безупречно в 2015 году.

Чтобы установить и работать, я смог найти только несколько очень устаревших руководств, поэтому подумал, что поделюсь тем, что я сделал для меня, установив последний стабильный выпуск (v1.1) в 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

Теперь у вас должны быть доступны все следующие функции:

lib_mysqludf_preg_info
preg_capture
preg_check
preg_replace
preg_rlike
preg_position
0 голосов
/ 03 ноября 2017

Начиная с mysql 5.5, вы можете использовать RLIKE :

  • либо сохраните URL в стиле REGEXP, и запросите с помощью

    ВЫБРАТЬ * ИЗ URL, ГДЕ '$ url' RLIKE url ;

  • или оставьте его в стиле LIKE и сделайте замену (% на. *, _ На.):

    ВЫБРАТЬ * ИЗ URL, ГДЕ '$ url' ЗАМЕНИТЬ RLIKE (ЗАМЕНА (url, '%', '. *'), '_', '.') ;

    Чтобы завершить, вы должны были бы сделать другие замены, чтобы избежать символов, которые являются значимыми для регулярного выражения:? \ () [] ... (см. функцию php preg_quote )

0 голосов
/ 10 ноября 2009

Я нашел решение. Это не идеально, но я добавлю это здесь на случай, если чистое решение SQL никогда не появится. Я могу оставить поле URL в MySQL равным «/ article /% / page /%» и добавить еще одно поле с именем переменных, в котором хранится список имен переменных, которые будут использоваться. Таким образом, я могу использовать свой исходный запрос, а затем заменить символы «%» в возвращаемом значении на «{{variable}}» в PHP на sprintf после получения данных.

Тем не менее, я хотел бы, чтобы это было решено в SQL, если это возможно, так как я думаю, что концепция полезна.

...