Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почистить HTML код, что то вроде word cleaner 
:(
    Опции темы
savage
Дата 3.10.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.8.2003

Репутация: -1
Всего: нет



Всем привет!
Поставили мне задачу перекинуть новости сайта из одной БД в другую. Дело не хитрое, но есть проблема. В БД с исходными новостями хранятся новости в сыром HTML коде, и большая часть скопированная прямо из Word. Получается что новость в два три предложения, раздувается до огромных размеров, + оформление уже не поправить через стили.
Может, у кого есть соображения, на тему: как почистить HTML новостей взятых из БД 1 для переправки (в нормальном виде) в БД 2. 
Хотяб чтоб такого не было:
Код

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> куча пустых тегов ... нормальный текст с оформлением</P>

А так:
Код

<p>текст</p>


P.S.: Новостей много, БД я себе на локальный компьютер скопировал – потому что понятное дело обработка потребует усиленных ресурсов.

PM MAIL   Вверх
Sunvas
Дата 3.10.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Покажи хотя бы от чего очистить, а то "куча пустых тегов" ниочем не говорит.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
savage
Дата 3.10.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.8.2003

Репутация: -1
Всего: нет



Ну вот типичный пример:
Код

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> куча пустых тегов ... нормальный текст с оформлением</P>

Такое обычно Word выдает.
А проще то так:
Код

<p> куча пустых тегов ... нормальный текст с оформлением</p>


PM MAIL   Вверх
bars80080
Дата 3.10.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



надо стукнуть очень сильно тех, кто верстал страницы в ворде

самому интересно, предложит ли кто что-нибудь?
PM MAIL WWW   Вверх
Nigel
Дата 3.10.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



Вообще, сразу нужно чистить такие вещи перед вставкой в базу, как делают многие приличные редакторы, например fck. Если уж у тебя получилось, что этого не было сделано, то тебе придется делать следующее:
- пройтись по базе, выбрав записи
- удалить вордовские куски
- залить все обратно.
1 и 3 пункт не должны составить труда. Насчет второго, ворд любит вставлять свои классы в теги. Как правило, это mso*. Следовательно, тебе и нужно будет это искать. Все тот же фцк для детекта использует следующую регулярку
Код

var re = /<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi ;

Ну, а дальше дело техники  smile 

Это сообщение отредактировал(а) Nigel - 3.10.2008, 20:58
PM MAIL   Вверх
password
Дата 3.10.2008, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: нет
Всего: 8



А если сохранить в файл, открыть в word-e и пересохранить в обычный текстовый файл, тогда уберется все форматирование и останется только один текст.
PM MAIL Skype   Вверх
skyboy
Дата 3.10.2008, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(password @  3.10.2008,  20:07 Найти цитируемый пост)
тогда уберется все форматирование и останется только один текст. 

в таком случае естественно к уже имеющемуся в БД применить strip_tags. однако речь не о полном удалении тегов.
PM MAIL   Вверх
savage
Дата 4.10.2008, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.8.2003

Репутация: -1
Всего: нет



Цитата(Nigel @ 3.10.2008,  20:57)
Вообще, сразу нужно чистить такие вещи перед вставкой в базу, как делают многие приличные редакторы, например fck. Если уж у тебя получилось, что этого не было сделано, то тебе придется делать следующее:
- пройтись по базе, выбрав записи
- удалить вордовские куски
- залить все обратно.
1 и 3 пункт не должны составить труда. Насчет второго, ворд любит вставлять свои классы в теги. Как правило, это mso*. Следовательно, тебе и нужно будет это искать. Все тот же фцк для детекта использует следующую регулярку
Код

var re = /<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi ;

Ну, а дальше дело техники  smile

Ну пока да - меня посетила такая же мысль. Но, чего то это не сильно чисто будет.
Жалко что нет просто вынесенных функций как у fck. Можно было бы базу выгрузить, прогнать через такие функции, сформировать новую выгрузку и уже ее пихать в новую БД.
PM MAIL   Вверх
ksnk
Дата 4.10.2008, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



savage, посмотрите в любом wyziwyg-е функцию чистки html'я от Ворда. Мне понравился подход fck-editor'а я даже очень тупо, с сохранением ненужных мне параметров, стырил комплект регулярок для чистки в свою cms'ку. Пришлось, правда адаптировать для моих непосредственных надобностей и написано оно на JavaScript. Но переписать регулярки на PHP несложно...
Код

// This function will be called from the PasteFromWord dialog (fck_paste.html)
// Input: oNode a DOM node that contains the raw paste from the clipboard
// bIgnoreFont, bRemoveStyles booleans according to the values set in the dialog
// Output: the cleaned string
function CleanWord( oNode, bIgnoreFont, bRemoveStyles )
{
    var html = oNode ;

    html = html.replace(/<o:p>\s*<\/o:p>/g, '') ;
    html = html.replace(/<o:p>.*?<\/o:p>/g, '&nbsp;') ;

    // Remove mso-xxx styles.
    html = html.replace( /\s*mso-[^:]+:[^;"]+;?/gi, '' ) ;

    // Remove margin styles.
    html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*;/gi, '' ) ;
    html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*"/gi, "\"" ) ;

    html = html.replace( /\s*TEXT-INDENT: 0cm\s*;/gi, '' ) ;
    html = html.replace( /\s*TEXT-INDENT: 0cm\s*"/gi, "\"" ) ;

    html = html.replace( /\s*TEXT-ALIGN: [^\s;]+;?"/gi, "\"" ) ;

    html = html.replace( /\s*PAGE-BREAK-BEFORE: [^\s;]+;?"/gi, "\"" ) ;

    html = html.replace( /\s*FONT-VARIANT: [^\s;]+;?"/gi, "\"" ) ;

    html = html.replace( /\s*tab-stops:[^;"]*;?/gi, '' ) ;
    html = html.replace( /\s*tab-stops:[^"]*/gi, '' ) ;

    // Remove FONT face attributes.
    if ( bIgnoreFont )
    {
        html = html.replace( /\s*face="[^"]*"/gi, '' ) ;
        html = html.replace( /\s*face=[^ >]*/gi, '' ) ;

        html = html.replace( /\s*FONT-FAMILY:[^;"]*;?/gi, '' ) ;
    }

    // Remove Class attributes
    html = html.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;

    // Remove styles.
    if ( bRemoveStyles )
        html = html.replace( /<(\w[^>]*) style="([^\"]*)"([^>]*)/gi, "<$1$3" ) ;

    // Remove empty styles.
    html =  html.replace( /\s*style="\s*"/gi, '' ) ;

    html = html.replace( /<SPAN\s*[^>]*>\s*&nbsp;\s*<\/SPAN>/gi, '&nbsp;' ) ;

    html = html.replace( /<SPAN\s*[^>]*><\/SPAN>/gi, '' ) ;

    // Remove Lang attributes
    html = html.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;

    html = html.replace( /<SPAN\s*>(.*?)<\/SPAN>/gi, '$1' ) ;

    html = html.replace( /<FONT\s*>(.*?)<\/FONT>/gi, '$1' ) ;

    // Remove XML elements and declarations
    html = html.replace(/<\\?\?xml[^>]*>/gi, '' ) ;

    // Remove Tags with XML namespace declarations: <o:p><\/o:p>
    html = html.replace(/<\/?\w+:[^>]*>/gi, '' ) ;

    // Remove comments [SF BUG-1481861].
    html = html.replace(/<\!--.*-->/g, '' ) ;

    html = html.replace( /<(U|I|STRIKE)>&nbsp;<\/\1>/g, '&nbsp;' ) ;

    html = html.replace( /<H\d>\s*<\/H\d>/gi, '' ) ;

    // Remove "display:none" tags.
    html = html.replace( /<(\w+)[^>]*\sstyle="[^"]*DISPLAY\s?:\s?none(.*?)<\/\1>/ig, '' ) ;

        html = html.replace( /<H1([^>]*)>/gi, '<div$1><b><font size="6">' ) ;
        html = html.replace( /<H2([^>]*)>/gi, '<div$1><b><font size="5">' ) ;
        html = html.replace( /<H3([^>]*)>/gi, '<div$1><b><font size="4">' ) ;
        html = html.replace( /<H4([^>]*)>/gi, '<div$1><b><font size="3">' ) ;
        html = html.replace( /<H5([^>]*)>/gi, '<div$1><b><font size="2">' ) ;
        html = html.replace( /<H6([^>]*)>/gi, '<div$1><b><font size="1">' ) ;

        html = html.replace( /<\/H\d>/gi, '<\/font><\/b><\/div>' ) ;

        // Transform <P> to <DIV>
        var re = new RegExp( '(<P)([^>]*>.*?)(<\/P>)', 'gi' ) ;    // Different because of a IE 5.0 error
        html = html.replace( re, '<div$2<\/div>' ) ;

        // place &nbsp; into empty td th.
        html = html.replace( /<(td|th)(\s[^>]*)?>\s*?<\/\1>/gi, '<$1>&nbsp;</$1>' ) ;
        // Remove empty tags (three times, just to be sure).
        // This also removes any empty anchor
        html = html.replace( /<([^\s>]+)(\s[^>]*)?>\s*<\/\1>/g, '' ) ;
        html = html.replace( /<(td|th)(\s[^>]*)?>\s*?<\/\1>/gi, '<$1>&nbsp;</$1>' ) ;
        html = html.replace( /<([^\s>]+)(\s[^>]*)?>\s*<\/\1>/g, '' ) ;
        html = html.replace( /<(td|th)(\s[^>]*)?>\s*?<\/\1>/gi, '<$1>&nbsp;</$1>' ) ;
        html = html.replace( /<([^\s>]+)(\s[^>]*)?>\s*<\/\1>/g, '' ) ;

    return html ;
}





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.