Очистка Word to HTML конвертирования

Тема в разделе "Регулярные выражения", создана пользователем drawing4, 20 май 2011.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. drawing4

    drawing4

    Регистр.:
    21 ноя 2008
    Сообщения:
    323
    Симпатии:
    37
    Хочу в php скрипте удалить лишние теги, но регулярка не работает когда есть перенос на другую строку.

    Есть код с мусором вида
    PHP:
    <p style="text-align: left;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings
        <
    o:AllowPNG /></o:OfficeDocumentSettings></xml><![endif]--><!--[if gte mso 9]><xml>
     <
    w:WordDocument>
      <
    w:View>Normal</w:View>
      <
    w:Zoom>0</w:Zoom></xml><![endif]-->
    Тут много буков</p>
    Нужна регулярка которая удаляет теги <xml>...<xml> вместе с содержимым.
    Подобрал такую:
    PHP:
    "/<xml>(.*)<\/xml>/e"
    Она работает когда текст в одну строку между <xml>...<xml>. Знаю что нужен модификатор s но почему-то не работает.


    К сожалению перепробовал кучу програм, удаляет и то что надо оставить.


    P.S. Подобрал такую

    PHP:
    <xml>(.*)\s(.*)</xml>
    на сайте работает а у меня нет почему-то. Где косяк? Сайт

    Перейти по ссылке
     
  2. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    Странно у меня так работает
    PHP:
    '/<xml>.*?<\/xml>/is'
    а почему не так?
    PHP:
    '/<!--\[if gte mso 9\]>.*?<!\[endif\]-->/is'
     
    drawing4 нравится это.
  3. drawing4

    drawing4

    Регистр.:
    21 ноя 2008
    Сообщения:
    323
    Симпатии:
    37
    Можно и так. Можно у вас попросить тестовый скрипт в котором регулярка у вас работает? У меня не хочет

    Делаю вот так (на PHP:(
    PHP:
    $pattern='/<xml>.*?<\/xml>/is';
    //$pattern='/<!--\[if gte mso 9\]>.*?<!\[endif\]-->/is';
    $html preg_replace($pattern''$input);    
     
  4. _sokal_

    _sokal_

    Регистр.:
    25 дек 2009
    Сообщения:
    300
    Симпатии:
    140
    Зачем изобретать колесо
    на Dreamweaver можно спокойно чистить.
    из вашего кода получается
    PHP:
    <p style="text-align: left;">Тут много буков</p>
     
  5. drawing4

    drawing4

    Регистр.:
    21 ноя 2008
    Сообщения:
    323
    Симпатии:
    37
    Мне в php скрипте надо почистить строку перед отправкой в базу
     
  6. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    PHP:
    <?php
    $html 
    '<p style="text-align: left;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> 
        <o:AllowPNG /></o:OfficeDocumentSettings></xml><![endif]--><!--[if gte mso 9]><xml>
     <w:WordDocument>
      <w:View>Normal</w:View>
      <w:Zoom>0</w:Zoom></xml><![endif]-->
    Тут много буков</p>'
    ;

    $html preg_replace('/<!--\[if gte mso 9\]>.*?<!\[endif\]-->/is','',$html);
    echo 
    $html;
    обычно проверяю работу своей Посмотреть вложение regex.rar тестилкой :)
     
    drawing4 нравится это.
  7. drawing4

    drawing4

    Регистр.:
    21 ноя 2008
    Сообщения:
    323
    Симпатии:
    37
    Все частично заработало. Проблема была в том что данные брались из файла а файл читался построчно, и только эти строки обрабатывались регуляркой. Когда объединил в одну строку все данные, почти все заработало.

    Есть такая часть кода

    PHP:
    <![endif]-->
    а есть такая

    PHP:
    <!--[endif]-->
    Как задать необязательное вхождение "--" в строку? Если я правильно понял то нужно заключать условия в круглые скобки
    Подскажите как соединить в одно:
    PHP:
    '/<!--\[if gte mso 9\]>.*?<!\[endif\]-->/is'
    '/<!--\[if gte mso 10\]>.*?<!\--\[endif\]-->/is'

    начало так

    /<!--\[if gte mso 9|10\]>.*?<!\              [endif\]-->/is

     а конец не пойму
     
  8. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    можно вообще так
    PHP:
    '/<!--\[if gte mso \d{1,2}+.*\[endif\]-->/si'
     
    drawing4 нравится это.
  9. drawing4

    drawing4

    Регистр.:
    21 ноя 2008
    Сообщения:
    323
    Симпатии:
    37
    Спасибо, заработало. А можно вас попросить объяснить вот эту часть

    PHP:
    '\d{1,2}+'

    Любая цифра максимум 2 вхождения т.е. двухзначное, а + ?
     
  10. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    \d цифра
    {1,2} одно или двухзначная
    + это обязательное присутствие хотя бы одного символа
     
    drawing4 нравится это.
Статус темы:
Закрыта.