Есть ли 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)