PHP Как убрать из текста всё Word`овское дерьмо?

*
2
*
✩
Юзер копипастит из Word`а текст в визвиг, а вместе с ним уходит и нечто вроде:

<w:BreakWrappedTables></w>
   <w:SnapToGridInCell></w>
   <w:WrapTextWithPunct></w>
   <w:UseAsianBreakRules></w>
   <w:DontGrowAutofit></w>

и прочая непотребная белиберда. Необходимо избавиться ;)
word визивиг php
1 месяц 2 дня назад
#ссылка не по теме? tweet
Обычно в WYSIWYG-редакторах есть функция вставки из Word, которая как раз удаляет все ненужное. Поищите, возможно, для вашего редактора есть модуль. – radioheaded 1 месяц 2 дня назад
комментировать



*
0
*
Элементарно!
1. Вырезать все тэги, которые не попадают под стандарты W3C (порой проще оставить только те, которые могут использоваться, и аттрибуты, которые позволительно использовать) ( это делается с помощью массива тегов и одного регулярного выражения )

Обычно, на сайтах все элементы (заголовки, абзацы, списки и проч., в том числе и таблицы) стилизованы. И правила для их вывода уже определены. Это исключает использование в "текстах" классы и стили. Убивайте все на корню!
2. Убрать все inline стили и классы, которые плодит Word

Пожайлуй, вы получите после этого чистый текст.

ps/ сегодня столкнулся с таким вопросом ;)
#ссылка не по теме?
1 месяц 2 дня назад
RayZ
[2310]
Алгоритм ясен был сразу, мне б реализацию узреть ;) – V-z-z-HobboT 1 месяц 2 дня назад
Можно использовать HtmlPurifier для php, прописать набор разрешенных тегов а остальные вырезать. – askdev 1 месяц 2 дня назад
Комментировать
*
-1
*

Как убрать аттрибуты тэга


без регулярного выражения:
function strip_attr($msg, $tag, $attr, $suffix = "")  {
  $lengthfirst = 0;
  while (strstr(substr($msg, $lengthfirst), "<$tag ") != "") {
    $tag_start = $lengthfirst + strpos(substr($msg, $lengthfirst), "<$tag ");
    $partafterwith = substr($msg, $tag_start);
    $img = substr($partafterwith, 0, strpos($partafterwith, ">") + 1);
    $img = str_replace(" =", "=", $img);
    $out = "<$tag";
    for($i = 0; $i < count($attr); $i++) {
      if (empty($attr[$i])) {
        continue;
      }

      $long_val =
        (strpos($img, " ", strpos($img, $attr[$i] . "=")) === false) ?
        strpos($img, ">", strpos($img, $attr[$i] . "="))(strpos($img, $attr[$i] . "=") + strlen($attr[$i]) + 1) :
        strpos($img, " ", strpos($img, $attr[$i] . "="))(strpos($img, $attr[$i] . "=") + strlen($attr[$i]) + 1);
 
      $val = substr($img, strpos($img, $attr[$i] . "=") + strlen($attr[$i]) + 1, $long_val);
      if (!empty($val)) {
        $out .= " " . $attr[$i] . "=" . $val;
      }
    }

    if (!empty($suffix)) {
      $out .= " " . $suffix;
    }

    $out .= ">";
    $partafter = substr($partafterwith, strpos($partafterwith, ">") + 1);
    $msg = substr($msg, 0, $tag_start) . $out . $partafter;
    $lengthfirst = $tag_start + 3;
  }
  return $msg;
}


С использованием регулярного выражения:
function strip_attr( $htmlString ) {
    $regEx = '/([^<]*<\s*[a-z](?:[0-9]|[a-z]{0,9}))(?:(?:\s*[a-z\-]{2,14}\s*=\s*(?:"[^"]*"|\'[^\']*\'))*)(\s*\/?>[^<]*)/i';
    $chunks = preg_split($regEx, $htmlString, -1,  PREG_SPLIT_DELIM_CAPTURE);
    $chunkCount = count($chunks);
    $strippedString = '
';
    for ($n = 1; $n < $chunkCount; $n++) {
        $strippedString .= $chunks[$n];
    }
    return $strippedString;
}


Как убрать лишние тэги


Убираем выбранные тэги
function strip_selected_tags($str, $tags = "", $stripContent = false)
{
    preg_match_all("/<([^>]+)>/i", $tags, $allTags, PREG_PATTERN_ORDER);
    foreach ($allTags[1] as $tag) {
        $replace = "%(<$tag.*?>)(.*?)(<\/$tag.*?>)%is";
        $replace2 = "%(<$tag.*?>)%is";
        echo $replace;
        if ($stripContent) {
            $str = preg_replace($replace,'',$str);
            $str = preg_replace($replace2,'',$str);
        }
            $str = preg_replace($replace,'${2}',$str);
            $str = preg_replace($replace2,'${2}',$str);
    }
    return $str;
}

Убираем ненужное, кроме указанных тэгов


function removeUnsafeAttributesAndGivenTags($input, $validTags = '') {
    $regex = '#\s*<(/?\w+)\s+(?:on\w+\s*=\s*(["\'\s])?.+?\(\1?.+?\1?\);?\1?|style=["\'].+?["\'])\s*>#is';
    return preg_replace($regex, '<${1}>',strip_tags($input, $validTags));
}


Кроме этого народ пишет прямо о вашей задаче:

Clean Word HTML using Regular Expressions


URL: http://tim.mackey.ie/CommentView,guid,2ece42de-a334-4fd0-8f94-53c6602d5718.aspx
The PHP Code appears in Post Comments
function cleanHTML($html) {
  /// <summary>
  /// Removes all FONT and SPAN tags, and all Class and Style attributes.
  /// Designed to get rid of non-standard Microsoft Word HTML tags.
  /// </summary>
  // start by completely removing all unwanted tags
  $html = ereg_replace("<(/)?(font|span|del|ins)[^>]*>","",$html);
  // then run another pass over the html (twice), removing unwanted attributes
  $html = ereg_replace("<([^>]*)(class|lang|style|size|face)=(\"[^\"]*\"|'[^']*'|[^>]+)([^>]*)>","<\\1>",$html);
  $html = ereg_replace("<([^>]*)(class|lang|style|size|face)=(\"[^\"]*\"|'[^']*'|[^>]+)([^>]*)>","<\\1>",$html);
  return $html
}


А еще есть HTML-Tidy с опцией Word-2000
У меня иногда складывается впечатление, что у вас заблокирован поиск.
#ссылка не по теме?
1 месяц 1 день назад
RayZ
[2310]

И в чем проблема? :) Тут собраны основные принципы очистки документа от грязи, почему минусуем-то? – RayZ 1 месяц 1 день назад
Комментировать

Ваш Ответ:



Ваш OpenID



Получить OpenID

Что такое OpenID?
или

Логин

Email

Пароль


Будет создана учетная запись и на email выслано письмо подтверждения.


новые ответы

Первый раз на сайте?

askdev.ru — это социальный сайт вопросов и ответов для IT-специалистов: программистов, веб-дизайнеров, системных администраторов.
о сайте » регистрация »

Показан

180 раз

Задан

1 месяц 2 дня назад

Теги

word x 3
визивиг x 2
php x 187
X

Пожалуйста, войдите:


Имя:
Пароль:
регистрация
Или используйте OpenID