note 60377 added to function.preg-replace
| From: | php-general at lists dot php dot net | Date: | Thu, 05 Jan 2006 10:09:34 +0000 |
| Subject: | note 60377 added to function.preg-replace | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-101243@lists.php.net to get a copy of this message | ||
First, I have no idea about regexp, all I did has been through trial and error,
I wrote this function which tries to clean crappy ms word html, I use it to clean user pasted code
to online wysiwyg online editors from ms word.
There´s a huge space for improvement, I post it here because after searching I could not find any
pure php solution, the best alternative however, is tidy, but for those of us who are still using
PHP 4 and do not have access to the server, this could be an alternative, use it under your own
risk... once again, it was a quickie and I know there can be much better ways to do this:
function decraper($htm, $delstyles=false) {
$commoncrap = array('"'
,'font-weight: normal;'
,'font-style: normal;'
,'line-height: normal;'
,'font-size-adjust: none;'
,'font-stretch: normal;');
$replace = array("'");
$htm = str_replace($commoncrap, $replace, $htm);
$pat = array();
$rep = array();
$pat[0] = '/(<table\s.*)(width=)(\d+%)(\D)/i';
$pat[1] = '/(<td\s.*)(width=)(\d+%)(\D)/i';
$pat[2] = '/(<th\s.*)(width=)(\d+%)(\D)/i';
$pat[3] = '/<td( colspan="[0-9]+")?( rowspan="[0-9]+")?
( width="[0-9]+")?( height="[0-9]+")?.*?>/i';
$pat[4] = '/<tr.*?>/i';
$pat[5]=
'/<\/st1:address>(<\/st1:\w*>)?
<\/p>[\n\r\s]*<p[\s\w="\']*>/i';
$pat[6] = '/<o:p.*?>/i';
$pat[7] = '/<\/o:p>/i';
$pat[8] = '/<o:SmartTagType[^>]*>/i';
$pat[9] = '/<st1:[\w\s"=]*>/i';
$pat[10] = '/<\/st1:\w*>/i';
$pat[11] = '/<p class="MsoNormal"[^>]*>(.*?)<\/p>/i';
$pat[12] = '/ style="margin-top: 0cm;"/i';
$pat[13] = '/<(\w[^>]*) class=([^ |>]*)([^>]*)/i';
$pat[14] = '/<ul(.*?)>/i';
$pat[15] = '/<ol(.*?)>/i';
$pat[17] = '/<br \/> <br \/>/i';
$pat[18] = '/ <br \/>/i';
$pat[19] = '/<!-.*?>/';
$pat[20] = '/\s*style=(""|\'\')/';
$pat[21] = '/ style=[\'"]tab-interval:[^\'"]*[\'"]/i';
$pat[22] = '/behavior:[^;\'"]*;*(\n|\r)*/i';
$pat[23] = '/mso-[^:]*:"[^"]*";/i';
$pat[24] = '/mso-[^;\'"]*;*(\n|\r)*/i';
$pat[25] = '/\s*font-family:[^;"]*;?/i';
$pat[26] = '/margin[^"\';]*;?/i';
$pat[27] = '/text-indent[^"\';]*;?/i';
$pat[28] = '/tab-stops:[^\'";]*;?/i';
$pat[29] = '/border-color: *([^;\'"]*)/i';
$pat[30] = '/border-collapse: *([^;\'"]*)/i';
$pat[31] = '/page-break-before: *([^;\'"]*)/i';
$pat[32] = '/font-variant: *([^;\'"]*)/i';
$pat[33] = '/<span [^>]*><br \/><\/span><br \/>/i';
$pat[34] = '/" "/';
$pat[35] = '/[\t\r\n]/';
$pat[36] = '/\s\s/s';
$pat[37] = '/ style=""/';
$pat[38] = '/<span>(.*?)<\/span>/i';
//empty (no attribs) spans
$pat[39] = '/<span>(.*?)<\/span>/i';
//twice, nested spans
$pat[40] = '/(;\s|\s;)/';
$pat[41] = '/;;/';
$pat[42] = '/";/';
$pat[43] = '/<li(.*?)>/i';
$pat[44] =
'/(<\/b><b>|<\/i><i>|<\/em><em>|
<\/u><u>|<\/strong><strong>)/i';
$rep[0] = '$1$2"$3"$4';
$rep[1] = '$1$2"$3"$4';
$rep[2] = '$1$2"$3"$4';
$rep[3] = '<td$1$2$3$4>';
$rep[4] = '<tr>';
$rep[5] = '<br />';
$rep[6] = '';
$rep[7] = '<br />';
$rep[8] = '';
$rep[9] = '';
$rep[10] = '';
$rep[11] = '$1<br />';
$rep[12] = '';
$rep[13] = '<$1$3';
$rep[14] = '<ul>';
$rep[15] = '<ol>';
$rep[17] = '<br />';
$rep[18] = '<br />';
$rep[19] = '';
$rep[20] = '';
$rep[21] = '';
$rep[22] = '';
$rep[23] = '';
$rep[24] = '';
$rep[25] = '';
$rep[26] = '';
$rep[27] = '';
$rep[28] = '';
$rep[29] = '';
$rep[30] = '';
$rep[31] = '';
$rep[32] = '';
$rep[33] = '<br />';
$rep[34] = '""';
$rep[35] = '';
$rep[36] = '';
$rep[37] = '';
$rep[38] = '$1';
$rep[39] = '$1';
$rep[40] = ';';
$rep[41] = ';';
$rep[42] = '"';
$rep[43] = '<li>';
$rep[44] = '';
if($delstyles===true){
$pat[50] = '/ style=".*?"/';
$rep[50] = '';
}
ksort($pat);
ksort($rep);
return $htm;
}
Hope it helps, critics are more than welcome.
----
Manual Page -- http://www.php.net/manual/en/function.preg-replace.php
Edit -- http://master.php.net/manage/user-notes.php?action=edit+60377
Delete: added to the manual -- http://master.php.net/manage/user-notes.php?action=delete+60377&report=yes&reason=added+to+the+manual
Delete: bad code -- http://master.php.net/manage/user-notes.php?action=delete+60377&report=yes&reason=bad+code
Delete: spam -- http://master.php.net/manage/user-notes.php?action=delete+60377&report=yes&reason=spam
Delete: useless -- http://master.php.net/manage/user-notes.php?action=delete+60377&report=yes&reason=useless
Delete: non-english -- http://master.php.net/manage/user-notes.php?action=delete+60377&report=yes&reason=non-english
Delete: already in docs -- http://master.php.net/manage/user-notes.php?action=delete+60377&report=yes&reason=already+in+docs
Delete: other reasons -- http://master.php.net/manage/user-notes.php?action=delete+60377&report=yes
Reject -- http://master.php.net/manage/user-notes.php?action=reject+60377&report=yes
Search -- http://master.php.net/manage/user-notes.php