|
Юзер копипастит из Word`а текст в визвиг, а вместе с ним уходит и нечто вроде:
<w:BreakWrappedTables></w> <w:SnapToGridInCell></w> <w:WrapTextWithPunct></w> <w:UseAsianBreakRules></w> <w:DontGrowAutofit></w> и прочая непотребная белиберда. Необходимо избавиться ;)
|
|||||||
|
|
Элементарно!
1. Вырезать все тэги, которые не попадают под стандарты W3C (порой проще оставить только те, которые могут использоваться, и аттрибуты, которые позволительно использовать) ( это делается с помощью массива тегов и одного регулярного выражения ) Обычно, на сайтах все элементы (заголовки, абзацы, списки и проч., в том числе и таблицы) стилизованы. И правила для их вывода уже определены. Это исключает использование в "текстах" классы и стили. Убивайте все на корню! 2. Убрать все inline стили и классы, которые плодит Word Пожайлуй, вы получите после этого чистый текст. ps/ сегодня столкнулся с таким вопросом ;)
|
|||||
|
|
Как убрать аттрибуты тэгабез регулярного выражения: 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 ExpressionsURL: 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 У меня иногда складывается впечатление, что у вас заблокирован поиск.
|
|||||
|