SQL Запрос с REGEXP для динамического изменения строк URL - PullRequest
0 голосов
/ 27 февраля 2020

Моя таблица БД с именем "post" выглядит следующим образом

id   |   message
----------------
1    |   test
2    |   Here is your image link: [LINK]https://example.com/images/1234[/LINK] You can view it now.
3    |   some strings
4    |   Here is your image link: [LINK]https://example.com/images/5678[/LINK] You can view it now.
5    |   [LINK]no correct url[/LINK]
6    |   [LINK][IMG]https://example.com/images/9123[/IMG][/LINK]
7    |   [LINK]https://example.com/images/912364[/LINK]
8    |   [LINK]Some text https://example.com/images/23456 Text again[/LINK]
9    |   [URL="https://example.com/images/10796"]

Поэтому не каждая строка сообщения содержит URL-адрес, и не каждое сообщение с тегом [LINK] содержит правильный URL-адрес. Также есть записи, которые имеют более длинный идентификатор, они не должны быть изменены.

Теперь мне нужно изменить каждую запись с длиной идентификатора от 4 до 5 символов:

https://example.com/images/1234
https://example.com/images/5678

В этот формат -> добавление расширения файла

https://example.com/images/1234.png
https://example.com/images/5678.png

Таким образом, «идентификатор» равен имени файла. Заменить только URL не так сложно, но мне нужно добавить расширение файла stati c, которое в моем случае ".png" в конце строки URL.

Редактировать //

В конце моя таблица БД должна выглядеть так:

id   |   message
----------------
1    |   test
2    |   Here is your image link: [LINK]https://example.com/images/1234.png[/LINK] You can view it now.
3    |   some strings
4    |   Here is your image link: [LINK]https://example.com/images/5678.png[/LINK] You can view it now.
5    |   [LINK]no correct url[/LINK]
6    |   [LINK][IMG]https://example.com/images/9123.png[/IMG][/LINK]
7    |   [LINK]https://example.com/images/912364[/LINK]
8    |   [LINK]Some text https://example.com/images/23456.png Text again[/LINK]
9    |   [URL="https://example.com/images/10796.png"]

Это добавление расширения файла к URL только там, где «URL-ID» имеет 4 или 5 цифр и только если URL совпадает.

Я абсолютно не опытный SQL пользователь.

1 Ответ

1 голос
/ 27 февраля 2020

Вы можете использовать регулярные выражения в MySQL, начиная с 8.0 и далее:

SELECT message AS original, REGEXP_REPLACE(message, '((http://|https://).*/images/[0-9]+)', '$1.png') AS new
  FROM Post 
  WHERE message REGEXP '.*(http://|https://).*/images/([0-9]{4,5})(?![0-9]).*'

Предложение where просто находит совпадения, где найдено https:// or 'http://, затем any characters и /images/ , затем any number, 4 or 5 times, затем [, or a letter or space, затем любые символы.

Значение (?![0-9]) важно, поскольку .* будет соответствовать любым символам, включая цифры. Так что без него найдутся совпадения с номерами 6+. По сути, это означает «Все, кроме числа».

Регулярное выражение использует группу захвата для захвата всего, что находится перед числами, и замены его на себя, плюс .png.

* 1019. * Результаты приведены в вашем примере:
Here is your image link: [LINK]https://example.com/images/1234.png[/LINK] You can view it now.
Here is your image link: [LINK]https://example.com/images/5678.png[/LINK] You can view it now.
[LINK][IMG]https://example.com/images/9123.png[/IMG][/LINK]
[LINK]Some text https://example.com/images/23456.png Text again[/LINK]
[URL="https://example.com/images/10796.png"]

DBFiddle

https://www.db-fiddle.com/# & Togetherjs = 4qC2I51yju

Редактировать: выше не будет работать в MariaDB

, поскольку вы используете MariaDB 10, взгляните на ссылку для функции REGEXP_REPLACE: https://mariadb.com/kb/en/regexp_replace/

Вам необходимо использовать \\1, а не $1. Поэтому замените $1.png на \\1.png, если вы используете MariaDB.

Последний запрос для обновления:

UPDATE Post SET message = REGEXP_REPLACE(message, '((http://|https://).*/images/[0-9]+)', '$1.png')
      WHERE message REGEXP '.*(http://|https://).*/images/([0-9]{4,5})(?!0-9]).*';

Измените $1.png на \\1.png для MariaDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...