Вы можете использовать регулярные выражения в 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