#mysql #string #replace
#mysql #строка #заменить
Вопрос:
У меня проблема с моей базой данных веб-сайта, в моей БД у меня есть сохраненные статьи, и мой веб-сайт извлекает их. Моя проблема связана с URL-адресами внутри статьи, потому что, когда я писал эти статьи, я забыл удалить апострофы из URL-адресов .. так что статья представляет собой текст, подобный этому.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Bona autem corporis huic sunt, quod posterius posui, similiora. Cur id non ita fit?
Check out <a href="www.example.com/this-is-an-example-l'oro.html">this is an example l'oro</a>
Поэтому я хотел бы удалить апостроф только из URL-адресов.
BEFORE:
<a href="www.example.com/this-is-an-example-l'oro.html">this is an example l'oro</a>
AFTER:
<a href="www.example.com/this-is-an-example-loro.html">this is an example l'oro</a>
Моя проблема в том, что апостроф должен быть удален только из URL-адресов внутри тега, а не в тексте статьи.
Я хотел бы исправить это с помощью запроса mysql, если это возможно
Комментарии:
1. Сформулируйте критерии, которые позволяют на 100% определить, что такое URL в вашем случае. Подстрока до (например,
'<a href="'
), подстрока после (например.'">'
), шаблон в… Если URL-адрес содержит более одного'
— все ли они должны быть удалены? Содержит ли значение строго один URL-адрес? 0 или 1? любое количество?2. @Akina Да, все
'
должно быть удалено из URL. Все URL-адреса находятся внутри<a href="URL">
тега, также все они из одного домена, поэтому example.com является общим для всех URL-адресов. На статью приходится 2 URL-адреса.3. Какова точная версия MySQL? Каково максимальное количество URL-адресов на значение? Могу ли я предположить, что текст статьи содержит строго 4
"
символа на значение?4. @Akina там написано 10.2.34-MariaDB-cll-lve — Сервер MariaDB, иногда в
"
статье их больше 4.
Ответ №1:
WITH RECURSIVE
cte AS ( SELECT id,
1 level,
CASE WHEN LOCATE('"', article)
THEN SUBSTRING(article FROM 1 FOR LOCATE('"', article))
ELSE article END chunk,
CASE WHEN LOCATE('"', article)
THEN SUBSTRING(article FROM 1 LOCATE('"', article))
ELSE '' END slack
FROM test
UNION ALL
SELECT id,
1 level,
CASE WHEN LOCATE('"', slack)
THEN SUBSTRING(slack FROM 1 FOR LOCATE('"', slack))
ELSE slack END,
CASE WHEN LOCATE('"', slack)
THEN SUBSTRING(slack FROM 1 LOCATE('"', slack))
ELSE '' END
FROM cte
WHERE TRIM(slack) != '' )
SELECT id,
GROUP_CONCAT(CASE WHEN LOCATE('www.example.com', chunk)
THEN REPLACE(chunk, ''', '')
ELSE chunk END ORDER BY level SEPARATOR '') article
FROM cte
GROUP BY id;
В рекурсивном CTE значение делится на куски символами d-кавычек. Затем ссылки href обнаруживаются подстрокой domain ( 'www.example.com'
), а символы кавычек удаляются. Наконец, значение восстанавливается обратно.
Комментарии:
1. Спасибо, он работает нормально и показывает поля с изменениями, но когда я обновляю и проверяю статьи, похоже, что они не обновляют статьи
2. @vamp выглядит так, как будто он, конечно, не обновляет статьи .. это SELECT . Если вам нужно обновить, присоедините этот запрос к другой таблице copy by
id
и обновите.