Поиск ссылок на сайте, начинающихся с цифры, в базе данных сайта с помощью оператора REGEXP MySQL

Когда-то давным-давно в те времена, когда Лунная База была мной поднята уже не помню в который раз и я начал формировать её структуру, всё бы сразу могло сложиться правильно, но, увы и ах, всего не учтёшь. И вот, по прошествии некоторого времени, я понял, что структуру нужно развивать и создал для каждой категории 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

Заберите ссылку на статью к себе, чтобы потом легко её найти ;)

Выберите, то, чем пользуетесь чаще всего:

Спасибо за внимание, оставайтесь на связи! Ниже ссылка на форум и обсуждение ; )

Войдите чтобы комментировать