За последние 24 часа нас посетили 21970 программистов и 1098 роботов. Сейчас ищут 748 программистов ...

Замена значения с условием

Тема в разделе "MySQL", создана пользователем koresh, 19 июл 2019.

Метки:
  1. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    Здравствуйте! Помогите написать запрос для MySQL.

    Ситуация такая, переношу сайт с CMS-ки на laravel.
    CMS-ка позволяла прописывать внутренние пути в html-атрибутах src="..." и href="..." без слеша вначале.

    Теперь в этих атрибутах (если они ссылаются на внутренние источники) нужно проставить слеш вначале.

    С src я разобрался. Есть папка images в пути, которая позволила написать такой запрос:
    Код (Text):
    1. UPDATE `blog_items` SET `article` = REPLACE(article, 'src="images/', 'src="/images/')
    А как быть с атрибутом href="..." ???
    Тут могут быть такие значения:
    • href="http......"
    • href="/...."
    • href="..."
    Получается нужно чтобы значение атрибута не начиналось с http и со слеша /

    Помогите написать такой запрос.
     
  2. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Код (Text):
    1.  
    2. UPDATE blog_items SET article =
    3. CASE
    4.   WHEN LOWER(LEFT(article, 4))='http' THEN article
    5.   WHEN LEFT(article, 1)='/' THEN article
    6.   ELSE CONCAT('/', article)
    7. END CASE
    --- Добавлено ---
    Можно этот запрос таки немножечко улучшить, но учитывая, что выполнить его надо будет один раз в жизни - сойдет и так :)
     
  3. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    Это точно сработает?

    Что мне нужно: если у меня в статье есть такая ссылка:
    Код (Text):
    1. <a href="forum">Форум PHP</a>
    То её нужно заменить так чтобы вначале был слеш:
    Код (Text):
    1. <a href="/forum">Форум PHP</a>
    При этом не трогать ссылки вида:
    Код (Text):
    1. <a href="https://php.ru/forum">Форум PHP</a>
    или если уже начинается со слеша.
     
  4. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Если Вам необходимо добавить слева прямой слеш в поле article таблицы blog_items для всех случаев, кроме если он там уже есть или начинается с http, то мой запрос сделает именно то, что Вы хотите. Ну с поправкой на возможные ошибки в синтаксисе, конечно.
     
  5. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    Пробую выполнить ваш запрос - получается ошибка.
    Вот:
     
  6. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    В конце запроса фразу ""END CASE" заменить на просто "END"

    Код (Text):
    1. UPDATE blog_items SET article =
    2. CASE
    3.   WHEN LOWER(LEFT(article, 4))='http' THEN article
    4.   WHEN LEFT(article, 1)='/' THEN article
    5.   ELSE CONCAT('/', article)
    6. END
     
    koresh нравится это.
  7. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    Исправил. Запрос выполнил.
    Результат - ничего не изменилось. В атрибутах href="..." так и остались значения без слеша в начале.
     
  8. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Я неправильно прочитал ваше исходное сообщение. Пожалуйста, уточните, как выглядит атрибут href="..." без слеша в начале и на что его нужно изменить?

    Если таких вариантов без слеша в начале можем быть несколько, приведите, пожалуйста, все возможные варианты.
     
  9. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    Даже не так. После запроса в каждую статью (столбец article) вставился слеш. Теперь все статьи на сайте начинаются со слеша.
    --- Добавлено ---
    В статьях есть ссылки. Многие из ссылок на внутренние страницы сайта. У них нет домена в атрибуте href, то есть ссылка идёт так:
    HTML:
    1. <a href="test/tset">Текст</a>
     
  10. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    В исходном сообщении Вы попросили помочь Вам написать запрос или написать его за Вас полностью?

    Мне кажется, имея (непроверенный и неоттестированный) текст запроса, кот. я написал можно определить, как его написать правильно. Нет?
     
    koresh нравится это.
  11. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    Для меня это сложный запрос, я не знаю как его написать. То что слеш вылез в статьях, то не беда - уберу, а вот как с атрибутом href разобраться, для меня проблема.
    С вашей постановки вопроса получается что "написать его за Вас полностью". Но при такой постановке задачи "сделай всё за меня" понятно что никто не захочет помогать. А мне с этим запросом нужна помощь, иначе вручную править статьи я засяду на очень долгое время.
     
  12. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Если Вы хотите, чтобы я написал запрос за Вас полностью, то уже ответьте на мои вопросы для того, чтобы я мог для Вас его написать?

     
  13. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    Всевозможных вариантов очень много, названия категорий, папки сайта - в общем текст мальнькими латиницей сразу после href=".
    Я думал изначально что можно как то с регуляркой построить запрос основываясь на том что есть первых 6-символов href=" (в конце двойная кавычка) и после этого href=" недолжно быть http или слеша.
    А с регуляркой у меня беда.
     
  14. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Боюсь, без четкого определения того, что нужно сделать, никто, в т.ч. и Вы сами, не сможет написать этот запрос. Независимо от того, идет ли речь о регулярках или о других инструментах.
     
  15. koresh

    koresh Новичок

    С нами с:
    11 июл 2019
    Сообщения:
    19
    Симпатии:
    0
    А какое должно быть чёткое определение?
    Есть столбец article в котором хранится html статей.
    В этих статьях есть ссылки. У ссылки есть атрибут href.
    Завязаться от самого тега <a не получиться так как могут быть атрибуты class и id.
    Но есть сам атрибут href. Перед ним есть один пробел, после него знак = и одна двойная кавычка "
    Если после кавычки идут латинские буквы, то перед ними нужно поставить слеш. Исключение если после кавычки идёт http

    Или мне нужно весь sitemap урлов выложить?
     
  16. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    Нет, к сожалению, я не готов писать такой запрос :)
     
    koresh нравится это.