Если у вас есть проблема и вы решили использовать регулярные выражения, у вас уже две проблемы
Как-то так сложилось, что большинство моих проектов на друпал - это не сайты с нуля, а апгрейд предыдущего, причём на другой CMS. Соответственно, возникает проблема переноса конетнта с предыдущего сайта. Чаще всего сайт-донор - это какая-нибудь древняя Joomla, на втором месте самопис, на третьем - спарсенные данные с других сайтов.
Данный пост - это небольшое раширение моего чек-листа для переноса из 6-ти пунктов.
1. Инлайн-стили и мусорные атрибуты
Это тот самый кошмар, который добавляют wysiwyg-редакторы.
Примеры: <p class="msoNormal>, <span style="line-height:1.3;">, <strong style="color:red;">
Все их стоит безжалостно выдирать.
Примеры регулярок:
Убрать все атрибуты у определённых тэгов.
Исходная строка: <p class="MsoNormal" style="color:#FF0000;">
Поиск: <(p|span|strong|em|i|b|ul|li).*?>
Замена: <$1>
Результат: <p>
Убрать все атрибуты, кроме определённых:
Исходная строка: <a class="MsoNormal" href="someurl" style="color:#FF0000;">
Поиск: <a\s.*?(href=".*?").*?>
Замена: <a $1>
Результат: <a href="someurl">
Убрать все инлайн-стили у тэга, кроме float:
Исходная строка: <img class="MsoNormal" style="color:#FF0000;float:left;" src="someurl" />
Поиск: <img\s(.*?)style=".*?float:(right|left|none).*?"(.*?)>
Замена: <img $1style="float:$2"$3>
Результат: <img class="MsoNormal" style="float:left" src="someurl" />
2. Пустые и лишние тэги
Путые строки в конце, тэги без содержимого, <br>
между </p><p>
, пробелы между блочными элементами? двойные пробелы и т.п.
Они не несут смысловой нагрузки, и могут поломать вёрстку.
Примеры: <p></p>, <b><i> </i></b>, </p> <p>
Примеры регулярок:
Убрать все пустые тэги (при условии, что они уже без атрибутов). Для пустых с тэгов с вложенностью может понадобиться несколько прогонов.
Поиск: <(.*?)>\s*</\1>
Замена: на ничто
Убрать вообще определённые тэги.
Поиск: </?(span|font|br).*?>
Замена: на ничто
3. Инлайн изображения
В случае с изображениями всё просто. Закидываем папку с изображениями со старого сайта к себе в sites/default/files/files_old (ну или куда хотите), затем регуляркой меняем старый префикс на новый. Пути лучше использовать относительные. В случае относительного пути - важно не забыть слэш в начале. Также стоит прогнать все изображения через оптимизатор, гугл это любит.
Пример регулярки:
Поиск: src="(https?://old-site.ru)?/assets/images/(.*?)"
Замена: src="/sites/default/files/images_old/$2"
4. Ссылки внутри.
Тут всё несколько сложнее. Часть ссылок может вести на скачивание каких-либо файлов. Часть ссылок может быть внешними. У некоторых могут быть относительные пути без слэша в начале, и ТАК ЗАДУМАНО. Общий совет - включить мозг и действовать по ситуации. Или сохранять старую структуру урлов на новом сайте. Или заранее прикинуть, какие урлы будут при переносе - вы же это уже сделали, да?
5. Редиректы.
Если структура урлов меняется, то естествено необходимо настроить редиректы со старых урлов на новые. Для этого нужны модули redirect и path_redirect_import
Модуль path_redirect_import позволяет импортировать данные по редиректам из csv файла. Если новые урлы кардинально другие, и чётко вычисляемой зависимости старый-новый нет, это придётся делать несколько через ж нетривиально.
В импортируемом материале создаём поле для хранения старого алиаса (например field_old_alias)
Для импортируемого типа материала задаём временный шаблон в pathauto, например articles/[node:field_old_path]
Импортируем редиректы. Модуль редирект - умный, он создаёт редиректы не на алиас, а на внутренний путь. Таким образом, как бы не менялись урлы материалов на сайте, урлы со старого сайта будут перенаправлять на соответствующие им материалы.
Задаём новый шаблон для импортированных материалов, обновляем алиасы. Вуаля.
6. Метатэги.
Наверняка на старом сайте есть метатэги, в каком либо виде. Модуль feeds дружит с модулем metatag, поэтому проблем возникнуть не должно.
И просто пара советов:
1. В CSV колонки с HTML делайте последними, так до них легче добраться регуляркой.
2. У phpmyadmin есть гениальная функция экспорта результата текущего запроса в csv. Только надо поставить галочку "Удалять переносы строк"
3. Если у сайта нет БД - есть модули feeds_querypath_parser и feeds_xpathparser. А также можно выдирать данные с помощью sed, awk и такой-то матери.
4. Не забывайте, что если ничто не помогает, данные можно перенести и вручную.
Комментарии
Спасибо что делитесь!
На главной.
ЗЫ - я часто пользуюсь классами PHP DOM.