Есть ли MySQL эквивалент PHP preg_replace?

Мне нужно сопоставить поле в 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 ответов

Решение

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

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

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

Похоже, что вы хотите сделать, это иметь новый синтаксис в базе данных, где 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/12/installing-the-mysql-preg-plugin-on-ubuntu-with-apt-get/

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

Пользователь 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

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

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

    SELECT * FROM urls, ГДЕ '$ url' RLIKE url;

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

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

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

Другие вопросы по тегам