пятница, 2 марта 2012 г.

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

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

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




взято отсюда http://www.askdev.ru/a/2703
без регулярного выражения:
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 
У меня иногда складывается впечатление, что у вас заблокирован поиск.

Комментариев нет:

Отправить комментарий