Условная замена SQL - PullRequest
       8

Условная замена SQL

0 голосов
/ 01 декабря 2018

Можно ли условно заменить части строк в MySQL?

Введение в проблему: пользователи в моей базе данных хранят статьи (таблица с именем "таблица", столбец "значение", каждая строка = одна статья)с неправильными ссылками на изображения.Я бы хотел починить их все сразу.Для этого мне нужно заменить все адреса в ссылках «href», за которыми следуют изображения, т. Е. <a href="link1"><img src="link2"></a> следует заменить на <a href="link2"><img src="link2"></a>. Моя идея состоит в том, чтобы искать каждый тег «href» и, если тегсопровождается и «img», чем я хотел бы получить «link2» из изображения и использовать его заменить «link1».Я знаю, как это сделать в bash или python, но у меня недостаточно опыта работы с MySQL.

Если быть точным, моя таблица содержит ссылки на такие изображения, как

<a href="www.a.cz/b/c"><img class="image image-thumbnail " src="www.d.cz/e/f.jpg" ...

Мне бы хотелосьзаменить первый адрес (href) ссылкой на изображение.Чтобы получить

<a href="www.d.cz/e/f.jpg"><img class="image image-thumbnail " src="www.d.cz/e/f.jpg" ...

Можно ли сделать запрос (запросы?), Например

UPDATE `table` 
SET value = REPLACE(value, 'www.a.cz/b/c', 'XXX') 
WHERE `value` LIKE '%www.a.cz/b/c%'

, где XXX каждый раз отличается, и его значение получается из базы данных?Более того, «www.a.cz/b/c» различается.

Чтобы усложнить задачу, не все изображения имеют ссылку «href», и не все ссылки относятся к изображениям.Возможны три варианта:

  1. «href», затем «img» -> replace

  2. «href», за которым не следует «img» -> сохранить исходную ссылку (возможно, ссылку на другую страницу)

  3. "img" без "href" -> ничего не делать (неправильная ссылка для замены)

Конечно, некоторые изображения могут иметь правильную ссылку.В этом случае он также может быть заменен (исходный и новый будут одинаковыми).

Информация о базе данных от phpMyAdmin

Программное обеспечение: MariaDB

Версия программного обеспечения: 10.1.32-MariaDB - Исходный код

Версия протокола: 10

Кодировка сервера: UTF-8 Unicode (utf8)

Apache

Версия клиента базы данных:libmysql - 5.6.15

Расширение PHP: mysqli

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Решено, спасибо @MatBailie, но мне пришлось изменить его ответ.Окончательная очередь, включая обновление, составляет

UPDATE `table` SET value = REGEXP_REPLACE(value, '(.*)<a href="([^"]+)"><img class="([^"]+)" src="([^"]+)"(.*)', '\\1<a href="\\4"><img class="\\3" src="\\4"\\5'

)

Подстановочный знак (. *) Необходимо было поставить в начале поиска, поскольку ссылка включена в статью (длинный текст) и, следовательно, аргументы шаблона замены увеличиваются.

0 голосов
/ 01 декабря 2018
SELECT
  regexp_replace(
    value,
    '^<a href="([^"]+)"><img class="([^"]+)" src="([^"]+)"(.*)$',
    '<a href="\\3"><img class="\\2" src="\\3"\\4'
  )
FROM
  yourTable

Замена происходит только в случае совпадения шаблона.

  • ^ в начале означает start of the string
  • ([^"]+) означает one of more characters, excluding "
  • (.*) означает ноль или более любого символа
  • $ в конце означает end of the string

Замена занимает 3-й «шаблон, заключенный в фигурные скобки»(обратная ссылка) и помещает его туда, где был 1-й «шаблон, заключенный в фигурные скобки» (обратная ссылка).

2-й, 3-й и 4-й обратные ссылки заменены собой (без изменений).

https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=96aef2214f844a1466772f41415617e5

Если у вас есть строки, которые точно не соответствуют шаблону, это ничего не изменит.Например, лишние пробелы сработают.

В этом случае вам нужно выработать новое регулярное выражение, которое всегда соответствует всем строкам, с которыми вы хотите работать.Затем для замены можно использовать обратные ссылки \\n.

Например, в следующем примере рассматриваются дополнительные пробелы в теге href ...

SELECT
  regexp_replace(
    value,
    '^<a[ ]+href[ ]*=[ ]*"([^"]+)"><img class="([^"]+)" src="([^"]+)"(.*)$',
    '<a href="\\3"><img class="\\2" src="\\3"\\4'
  )
FROM
  yourTable

РЕДАКТИРОВАТЬ:

После комментариев, поясняющих, что это на самом деле фрагменты из середины строки ...

https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=48ce1cc3df5bf4d3d140025b662072a7

UPDATE
  yourTable
SET
  value = REGEXP_REPLACE(
            value,
            '<a href="([^"]+)"><img class="([^"]+)" src="([^"]+)"',
            '<a href="\\3"><img class="\\2" src="\\3"'
         )
WHERE
  value REGEXP '<a href="([^"]+)"><img class="([^"]+)" src="([^"]+)"'

(Хотя я предпочитаю синтаксис RLIKE, он функционально идентичен.)

Это также найдет замену этому шаблону несколько раз.Вам не ясно, если это желательно или возможно.

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