note 99640 added to function.strip-tags
| From: | tom at cowin dot us | Date: | Fri, 27 Aug 2010 18:48:52 +0000 |
| Subject: | note 99640 added to function.strip-tags | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-172120@lists.php.net to get a copy of this message | ||
With most web based user input or more than a line of text, it seems I get 90% 'paste from
Word'. I've developed this fn over time to try to strip all of this cruft out. A few
things I do here are application specific, but if it helps you - great, if you can improve on it or
have a better way - please - post it...
function strip_word_html($text, $allowed_tags =
'<b><i><sup><sub><em><strong><u><br>')
{
mb_regex_encoding('UTF-8');
//replace MS special characters first
$search = array('/‘/u', '/’/u',
'/“/u', '/”/u', '/—/u');
$replace = array('\'', '\'', '"',
'"', '-');
$text = preg_replace($search, $replace, $text);
//make sure _all_ html entities are converted to the plain ascii equivalents - it appears
//in some MS headers, some html entities are encoded and some aren't
$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
//try to strip out any C style comments first, since these, embedded in html comments, seem
to
//prevent strip_tags from removing html comments (MS Word introduced combination)
if(mb_stripos($text, '/*') !== FALSE){
$text = mb_eregi_replace('/\*(.)*\*', '', $text, 'm');
}
//introduce a space into any arithmetic expressions that could be caught by strip_tags so
that they won't be
//'<1' becomes '< 1'(note: somewhat application specific)
$text = preg_replace(array('/<([0-9]+)/'), array('< $1'), $text);
$text = strip_tags($text, $allowed_tags);
//eliminate extraneous whitespace from start and end of line, or anywhere there are two or
more spaces, convert it to one
$text = preg_replace(array('/^\s\s+/', '/\s\s+$/',
'/\s\s+/u'), array('', '', ' '), $text);
//strip out inline css and simplify style tags
$search = array('#<(strong|b)[^>]*>(.*?)</(strong|b)>#isu',
'#<(em|i)[^>]*>(.*?)</(em|i)>#isu',
'#<u[^>]*>(.*?)</u>#isu', '#<br\s{0,1}/{0,1}>#');
$replace = array('<b>$2</b>', '<i>$2</i>',
'<u>$1</u>', '\n');
$text = preg_replace($search, $replace, $text);
//on some of the ?newer MS Word exports, where you get conditionals of the form 'if gte
mso 9', etc., it appears
//that whatever is in one of the html comments prevents strip_tags from eradicating the html
comment that contains
//some MS Style Definitions - this last bit gets rid of any leftover comments
$num_matches = preg_match_all("/\<!--/u", $text, $matches);
if($num_matches){
$text = preg_replace('/\<!--(.)*--\>/isu', '', $text);
}
return $text;
}
----
Server IP: 69.147.83.197
Probable Submitter: 71.164.23.176
----
Manual Page -- http://www.php.net/manual/en/function.strip-tags.php
Edit -- https://master.php.net/note/edit/99640
Del: integrated -- https://master.php.net/note/delete/99640/integrated
Del: useless -- https://master.php.net/note/delete/99640/useless
Del: bad code -- https://master.php.net/note/delete/99640/bad+code
Del: spam -- https://master.php.net/note/delete/99640/spam
Del: non-english -- https://master.php.net/note/delete/99640/non-english
Del: in docs -- https://master.php.net/note/delete/99640/in+docs
Del: other reasons-- https://master.php.net/note/delete/99640
Reject -- https://master.php.net/note/reject/99640
Search -- https://master.php.net/manage/user-notes.php