Когда-то давным-давно в те времена, когда Лунная База была мной поднята уже не помню в который раз и я начал формировать её структуру, всё бы сразу могло сложиться правильно, но, увы и ах, всего не учтёшь. И вот, по прошествии некоторого времени, я понял, что структуру нужно развивать и создал для каждой категории Joomla свой пункт меню. И... тут таааакое началось! Для тех категорий, у которых до этого не было своего пункта меню поменялись URL, а значит, все ссылки на сайте, которыми я перелинковывал отдельные статьи стали иметь своих дублёров (из тех, что формируются динамически движком Joomla). Большую часть я поправил ручками и массовой заменой в базе данных через phpMyAdmin. Но не все. Что-то ещё осталось. И пришло время финального наведения порядка с заменой оставшихся старых URL на новые. О том, как это автоматизировать, собственно эта статья посвящается. =)
Старые ссылки, которые нужно найти
Итак, в прежнюю эпоху ссылки были на категории. Сильно упрощает жизнь то, что они относительные. Выглядели они примерно так:
<a title="Регистрация в Instagram с компьютера" href="/social-network/instagram/522-instagram-pc-registration.html"><strong>после регистрации</strong></a>
И что ещё важно, в базе данных сайта они хранятся в форме
href="social-network/instagram/522-instagram-pc-registration.html
То есть без обратного слэша в начале. То есть, начинаются с цифры (ID категории). Зная это, устроим поиск в базе данных по этому значению.
Условие LIKE
в MySQL
Воспользовавшись условием LIKE
по конкретному полю introtext
в таблице постов joomla_content
, если задать известную цифру:
SELECT * FROM `joomla_content` WHERE `introtext` LIKE '%href="57%'
получим выборку всех записей, где в тексте есть совпадение href="57
. Для того, чтобы искать совпадение по всему тексту (и в начале, и в конце, и в середине), используем символ %
, который в MySQL означает «какие угодно символы».
Это если известно ID категории и его можно точно указать. Однако, стоит расширить поиск, введя вместо конкретного значения диапазон [0-9]
(эта запись означает - все символы от 0 до 9, то есть все цифры):
SELECT * FROM `joomla_content` WHERE `introtext` LIKE '%href="[0-9]'
в итоге ничего не получим: — ни одного совпадения не найдено. Странно, печально, но тут самое время вспомнить про регулярные выражения (регэкспы)...
Условие REGEXP
в MySQL
Применим REGEXP
для решения этой (на первый взгляд) тривиальной задачи:
SELECT * FROM `joomla_content` WHERE `introtext` REGEXP 'href="[0-9]'
И Ура(!) всё находится! Значит, для таких типов задач нужно применять условия с регулярным выражением REGEXP
, а не с LIKE
. Потратив на решение этой задачи пару-тройку часов, пытаясь решить её с помощью LIKE
, подсовывая ему (ей(?)) разные варианты того, как могут выглядеть цифры, но так ничего и не добившись, я решил посмотреть в сторону регэкспов и, практически сразу, решил стоящую задачу формирования выборки по условию из базы данных.
Делюсь для тех, кто нашёл эту статью + сохраняю найденное решение себе на долгую память (полученный опыт нужно аккумулировать). =D
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)