Есть ли эквивалент 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, если это возможно, поскольку я считаю, что концепция ценна.

Ответ 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)