Есть ли эквивалент 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 больше не является правильным сравнением, так как я не использую встроенный шаблон "%", а скорее {{. *}}. Любые идеи, как это сделать?
Ответы
Ответ 1
Я нашел решение. Это не идеально, но я приведу его здесь, если чистое SQL-решение никогда не появится. Я могу оставить поле url в MySQL равным "/articles/%/page/%" и добавить другое поле, называемое переменными, которое хранит список имен переменных, которые будут использоваться. Таким образом, я могу использовать свой первоначальный запрос, а затем заменить символы "%" в возвращаемом значении с помощью "{{variable}}" в PHP с помощью sprintf после того, как я извлек данные.
Тем не менее, я бы хотел, чтобы это было разрешено в SQL, если это возможно, поскольку я считаю, что концепция ценна.
Ответ 2
Существует библиотека пользовательских функций, которая дает вам preg_replace в MySQL:
http://www.mysqludf.org/lib_mysqludf_preg/
Ответ 3
Похоже, что вы хотите использовать новый синтаксис в базе данных, где в URL-адресах есть заполнители, которые вы передадите в код замены переменных на основе php (sprintf), но все же сможете выполнять исходные сравнения для соответствия URL.
Если я правильно понял, вы хотите использовать новый формат URL
/article/{{slug}}/page/{{page_no}}
и сопоставьте его с чем-то вроде
/article/my-article/page/2
Указанный preg плагин sagi может сделать необходимую вам замену, которая превратит один из ваших вновь отформатированных 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/
Ответ 4
Пользователь 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
Ответ 5
Начиная с mysql 5.5, вы можете использовать RLIKE:
-
либо сохранить URL-адрес в REGEXP-стиле, либо запросить с помощью
SELECT * FROM urls WHERE '$ url' URL-адрес RLIKE;
-
или сохраните его в стиле LIKE и сделайте замену (% by. *, _ by.):
SELECT * FROM urls WHERE '$ url' RLIKE REPLACE (REPLACE (url, '%', '. *'), '_', '.');
Чтобы быть полным, вам нужно было бы сделать другие замены, чтобы избежать символов, которые имеют регулярное выражение:? \() []... (см. функцию php preg_quote)