discuzcode.func.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: discuzcode.func.php 36284 2016-12-12 00:47:50Z nemohou $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. include template('mobile:discuzcode');
  12. function mobile_discuzcode($param) {
  13. global $_G;
  14. list($message, $smileyoff, $bbcodeoff, $htmlon, $allowsmilies, $allowbbcode, $allowimgcode, $allowhtml, $jammer, $parsetype, $authorid, $allowmediacode, $pid, $lazyload, $pdateline, $first) = $param;
  15. static $authorreplyexist;
  16. $message = preg_replace(array(lang('forum/misc', 'post_edit_regexp'), lang('forum/misc', 'post_edithtml_regexp'), lang('forum/misc', 'post_editnobbcode_regexp')), '', $message);
  17. if($pid && strpos($message, '[/password]') !== FALSE) {
  18. if($authorid != $_G['uid'] && !$_G['forum']['ismoderator']) {
  19. $message = preg_replace_callback("/\s?\[password\](.+?)\[\/password\]\s?/i", create_function('$matches', 'return parsepassword($matches[1], '.intval($pid).');'), $message);
  20. if($_G['forum_discuzcode']['passwordlock'][$pid]) {
  21. return '';
  22. }
  23. } else {
  24. $message = preg_replace("/\s?\[password\](.+?)\[\/password\]\s?/i", "", $message);
  25. $_G['forum_discuzcode']['passwordauthor'][$pid] = 1;
  26. }
  27. }
  28. if($parsetype != 1 && !$bbcodeoff && $allowbbcode && (strpos($message, '[/code]') || strpos($message, '[/CODE]')) !== FALSE) {
  29. $message = preg_replace_callback("/\s?\[code\](.+?)\[\/code\]\s?/is", 'mobile_discuzcode_callback_mobile_parsecode_1', $message);
  30. }
  31. $msglower = strtolower($message);
  32. $htmlon = $htmlon && $allowhtml ? 1 : 0;
  33. if(!$htmlon) {
  34. $message = dhtmlspecialchars($message);
  35. } else {
  36. $message = preg_replace("/<script[^\>]*?>(.*?)<\/script>/i", '', $message);
  37. }
  38. if(!$smileyoff && $allowsmilies) {
  39. $message = mobile_parsesmiles($message);
  40. }
  41. if($_G['setting']['allowattachurl'] && strpos($msglower, 'attach://') !== FALSE) {
  42. $message = preg_replace_callback("/attach:\/\/(\d+)\.?(\w*)/i", 'mobile_discuzcode_callback_parseattachurl_12', $message);
  43. }
  44. if($allowbbcode) {
  45. if(strpos($msglower, 'ed2k://') !== FALSE) {
  46. $message = preg_replace_callback("/ed2k:\/\/(.+?)\//", 'mobile_discuzcode_callback_mobile_parseed2k_1', $message);
  47. }
  48. }
  49. if(!$bbcodeoff && $allowbbcode) {
  50. if(strpos($msglower, '[/url]') !== FALSE) {
  51. $message = preg_replace_callback("/\[url(=((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|thunder|qqdl|synacast){1}:\/\/|www\.|mailto:)?([^\r\n\[\"']+?))?\](.+?)\[\/url\]/is", 'mobile_discuzcode_callback_mobile_parseurl_152', $message);
  52. }
  53. if(strpos($msglower, '[/email]') !== FALSE) {
  54. $message = preg_replace_callback("/\[email(=([a-z0-9\-_.+]+)@([a-z0-9\-_]+[.][a-z0-9\-_.]+))?\](.+?)\[\/email\]/is", 'mobile_discuzcode_callback_mobile_parseemail_14', $message);
  55. }
  56. $nest = 0;
  57. while(strpos($msglower, '[table') !== FALSE && strpos($msglower, '[/table]') !== FALSE){
  58. $message = preg_replace_callback("/\[table(?:=(\d{1,4}%?)(?:,([\(\)%,#\w ]+))?)?\]\s*(.+?)\s*\[\/table\]/is", 'mobile_discuzcode_callback_mobile_parsetable_123', $message);
  59. if(++$nest > 4) break;
  60. }
  61. $message = str_replace(array(
  62. '[/color]', '[/backcolor]', '[/size]', '[/font]', '[/align]', '[b]', '[/b]', '[s]', '[/s]', '[hr]', '[/p]',
  63. '[i=s]', '[i]', '[/i]', '[u]', '[/u]', '[list]', '[list=1]', '[list=a]',
  64. '[list=A]', "\r\n[*]", '[*]', '[/list]', '[indent]', '[/indent]', '[/float]'
  65. ), array(
  66. '</font>', '</font>', '', '', '', '<strong>', '</strong>', '<strike>', '</strike>', '<hr class="l" />', '</p>', '', '',
  67. '', '', '', '<ul>', '<ul type="1" class="litype_1">', '<ul type="a" class="litype_2">',
  68. '<ul type="A" class="litype_3">', '<li>', '<li>', '</ul>', '', '', ''
  69. ), preg_replace(array(
  70. "/\[color=([#\w]+?)\]/i",
  71. "/\[color=((rgb|rgba)\([\d\s,]+?\))\]/i",
  72. "/\[backcolor=([#\w]+?)\]/i",
  73. "/\[backcolor=((rgb|rgba)\([\d\s,]+?\))\]/i",
  74. "/\[size=(\d{1,2}?)\]/i",
  75. "/\[size=(\d{1,2}(\.\d{1,2}+)?(px|pt)+?)\]/i",
  76. "/\[font=([^\[\<]+?)\]/i",
  77. "/\[align=(left|center|right)\]/i",
  78. "/\[p=(\d{1,2}|null), (\d{1,2}|null), (left|center|right)\]/i",
  79. "/\[float=left\]/i",
  80. "/\[float=right\]/i"
  81. ), array(
  82. "<font color=\"\\1\">",
  83. "<font style=\"color:\\1\">",
  84. "<font style=\"background-color:\\1\">",
  85. "<font style=\"background-color:\\1\">",
  86. "",
  87. "",
  88. "",
  89. "",
  90. "<p>",
  91. "",
  92. ""
  93. ), $message));
  94. $message = preg_replace("/\s?\[postbg\]\s*([^\[\<\r\n;'\"\?\(\)]+?)\s*\[\/postbg\]\s?/is", "", $message);
  95. if($parsetype != 1) {
  96. if(strpos($msglower, '[/quote]') !== FALSE) {
  97. $message = preg_replace("/\s?\[quote\][\n\r]*(.+?)[\n\r]*\[\/quote\]\s?/is", mobile_quote(), $message);
  98. }
  99. if(strpos($msglower, '[/free]') !== FALSE) {
  100. $message = preg_replace("/\s*\[free\][\n\r]*(.+?)[\n\r]*\[\/free\]\s*/is", mobile_free(), $message);
  101. }
  102. }
  103. if(strpos($msglower, '[/media]') !== FALSE) {
  104. $message = preg_replace_callback("/\[media=([\w,]+)\]\s*([^\[\<\r\n]+?)\s*\[\/media\]/is", 'mobile_discuzcode_callback_bbcodeurl_media2', $message);
  105. }
  106. if(strpos($msglower, '[/audio]') !== FALSE) {
  107. $message = preg_replace_callback("/\[audio(=1)*\]\s*([^\[\<\r\n]+?)\s*\[\/audio\]/is", 'mobile_discuzcode_callback_bbcodeurl_href2', $message);
  108. }
  109. if(strpos($msglower, '[/flash]') !== FALSE) {
  110. $message = preg_replace_callback("/\[flash(=(\d+),(\d+))?\]\s*([^\[\<\r\n]+?)\s*\[\/flash\]/is", 'mobile_discuzcode_callback_bbcodeurl_4', $message);
  111. }
  112. if($parsetype != 1 && $allowbbcode < 0 && isset($_G['cache']['bbcodes'][-$allowbbcode])) {
  113. $message = preg_replace($_G['cache']['bbcodes'][-$allowbbcode]['searcharray'], $_G['cache']['bbcodes'][-$allowbbcode]['replacearray'], $message);
  114. }
  115. if($parsetype != 1 && strpos($msglower, '[/hide]') !== FALSE && $pid) {
  116. if($_G['setting']['hideexpiration'] && $pdateline && (TIMESTAMP - $pdateline) / 86400 > $_G['setting']['hideexpiration']) {
  117. $message = preg_replace("/\[hide[=]?(d\d+)?[,]?(\d+)?\]\s*(.*?)\s*\[\/hide\]/is", "\\3", $message);
  118. $msglower = strtolower($message);
  119. }
  120. if(strpos($msglower, '[hide=d') !== FALSE) {
  121. $message = preg_replace_callback("/\[hide=(d\d+)?[,]?(\d+)?\]\s*(.*?)\s*\[\/hide\]/is", create_function('$matches', 'return expirehide($matches[1], $matches[2], $matches[3], '.intval($pdateline).');'), $message);
  122. $msglower = strtolower($message);
  123. }
  124. if(strpos($msglower, '[hide]') !== FALSE) {
  125. if($authorreplyexist === null) {
  126. if(!$_G['forum']['ismoderator']) {
  127. if($_G['uid']) {
  128. $authorreplyexist = C::t('forum_post')->fetch_pid_by_tid_authorid($_G['tid'], $_G['uid']);
  129. }
  130. } else {
  131. $authorreplyexist = TRUE;
  132. }
  133. }
  134. if($authorreplyexist) {
  135. $message = preg_replace("/\[hide\]\s*(.*?)\s*\[\/hide\]/is", mobile_hide_reply(), $message);
  136. } else {
  137. $message = preg_replace("/\[hide\](.*?)\[\/hide\]/is", mobile_hide_reply_hidden(), $message);
  138. }
  139. }
  140. if(strpos($msglower, '[hide=') !== FALSE) {
  141. $message = preg_replace_callback("/\[hide=(\d+)\]\s*(.*?)\s*\[\/hide\]/is", create_function('$matches', 'return creditshide($matches[1], $matches[2], '.intval($pid).', '.intval($authorid).');'), $message);
  142. }
  143. }
  144. }
  145. if(strpos($message, '[/tthread]') !== FALSE) {
  146. $matches = array();
  147. preg_match('/\[tthread=(.+?),(.+?)\](.*?)\[\/tthread\]/', $message, $matches);
  148. $message = preg_replace('/\[tthread=(.+?)\](.*?)\[\/tthread\]/', lang('plugin/qqconnect', 'connect_tthread_message', array('username' => $matches[1], 'nick' => $matches[2])), $message);
  149. }
  150. if(!$bbcodeoff) {
  151. if($parsetype != 1 && strpos($msglower, '[swf]') !== FALSE) {
  152. $message = preg_replace_callback("/\[swf\]\s*([^\[\<\r\n]+?)\s*\[\/swf\]/is", 'mobile_discuzcode_callback_bbcodeurl_1', $message);
  153. }
  154. $attrsrc = !IS_ROBOT && $lazyload ? 'file' : 'src';
  155. if(strpos($msglower, '[/img]') !== FALSE) {
  156. $message = preg_replace_callback("/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/is", create_function('$matches', 'return '.intval($allowimgcode).' ? mobile_parseimg(0, 0, $matches[1], '.intval($lazyload).', '.intval($pid).', \'onmouseover="img_onmouseoverfunc(this)" \'.('.intval($lazyload).' ? \'lazyloadthumb="1"\' : \'onload="thumbImg(this)"\')) : ('.intval($allowbbcode).' ? (!defined(\'IN_MOBILE\') ? bbcodeurl($matches[1], \'<a href="{url}" target="_blank">{url}</a>\') : bbcodeurl($matches[1], \'\')) : bbcodeurl($matches[1], \'{url}\'));'), $message);
  157. $message = preg_replace_callback("/\[img=(\d{1,4})[x|\,](\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/is", create_function('$matches', 'return '.intval($allowimgcode).' ? mobile_parseimg($matches[1], $matches[2], $matches[3], '.intval($lazyload).', '.intval($pid).') : ('.intval($allowbbcode).' ? (!defined(\'IN_MOBILE\') ? bbcodeurl($matches[3], \'<a href=\"{url}\" target=\"_blank\">{url}</a>\') : bbcodeurl($matches[3], \'\')) : bbcodeurl($matches[3], \'{url}\'));'), $message);
  158. }
  159. }
  160. for($i = 0; $i <= $_G['forum_discuzcode']['pcodecount']; $i++) {
  161. $message = str_replace("[\tDISCUZ_CODE_$i\t]", $_G['forum_discuzcode']['codehtml'][$i], $message);
  162. }
  163. unset($msglower);
  164. $message = preg_replace("/(\[groupid=\d+\].*\[\/groupid\])/i", '', $message);
  165. $message = preg_replace("/(\r\n|\n|\r){3,}/i", "\\1\\1\\1", $message);
  166. return $message;
  167. }
  168. function mobile_discuzcode_callback_mobile_parsecode_1($matches) {
  169. return mobile_parsecode($matches[1]);
  170. }
  171. function mobile_discuzcode_callback_parseattachurl_12($matches) {
  172. return parseattachurl($matches[1], $matches[2], 1);
  173. }
  174. function mobile_discuzcode_callback_mobile_parseed2k_1($matches) {
  175. return mobile_parseed2k($matches[1]);
  176. }
  177. function mobile_discuzcode_callback_mobile_parseurl_152($matches) {
  178. return mobile_parseurl($matches[1], $matches[5], $matches[2]);
  179. }
  180. function mobile_discuzcode_callback_mobile_parseemail_14($matches) {
  181. return strip_tags(parseemail($matches[1], $matches[4]));
  182. }
  183. function mobile_discuzcode_callback_mobile_parsetable_123($matches) {
  184. return mobile_parsetable($matches[1], $matches[2], $matches[3]);
  185. }
  186. function mobile_discuzcode_callback_bbcodeurl_media2($matches) {
  187. return bbcodeurl($matches[2], '<a class="media" href="{url}" target="_blank">{url}</a>');
  188. }
  189. function mobile_discuzcode_callback_bbcodeurl_href2($matches) {
  190. return bbcodeurl($matches[2], '<a href="{url}" target="_blank">{url}</a>');
  191. }
  192. function mobile_discuzcode_callback_bbcodeurl_4($matches) {
  193. return bbcodeurl($matches[4], '<a href="{url}" target="_blank">{url}</a>');
  194. }
  195. function mobile_discuzcode_callback_bbcodeurl_1($matches) {
  196. return bbcodeurl($matches[1], ' <img src="'.STATICURL.'image/filetype/flash.gif" align="absmiddle" alt="" /> <a href="{url}" target="_blank">Flash: {url}</a> ');
  197. }
  198. function mobile_parseurl($url, $text, $scheme) {
  199. global $_G;
  200. if(!$url && preg_match("/((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|thunder|qqdl|synacast){1}:\/\/|www\.)[^\[\"']+/i", trim($text), $matches)) {
  201. $url = $matches[0];
  202. $length = 65;
  203. if(strlen($url) > $length) {
  204. $text = substr($url, 0, intval($length * 0.5)).' ... '.substr($url, - intval($length * 0.3));
  205. }
  206. $url = substr(strtolower($url), 0, 4) == 'www.' ? 'http://'.$url : $url;
  207. return '<a href="'.$url.'">'.$text.'</a>';
  208. } else {
  209. $url = substr($url, 1);
  210. if(substr(strtolower($url), 0, 4) == 'www.') {
  211. $url = 'http://'.$url;
  212. }
  213. $url = !$scheme ? $_G['siteurl'].$url : $url;
  214. return '<a href="'.$url.'">'.$text.'</a>';
  215. }
  216. }
  217. function mobile_parsecode($code) {
  218. global $_G;
  219. $_G['forum_discuzcode']['pcodecount']++;
  220. $code = dhtmlspecialchars(str_replace('\\"', '"', $code));
  221. $code = str_replace("\n", "<li>", $code);
  222. $_G['forum_discuzcode']['codehtml'][$_G['forum_discuzcode']['pcodecount']] = mobile_codedisp($code);
  223. $_G['forum_discuzcode']['codecount']++;
  224. return "[\tDISCUZ_CODE_".$_G['forum_discuzcode']['pcodecount']."\t]";
  225. }
  226. function mobile_parseimg($width, $height, $url) {
  227. global $_G;
  228. $url = htmlspecialchars(str_replace(array('<', '>'), '', str_replace('\\"', '\"', $url)));
  229. if(strtolower(substr($url, 0, 7)) == 'static/') {
  230. $url = $_G['siteurl'].$url;
  231. }
  232. if(!in_array(strtolower(substr($url, 0, 6)), array('http:/', 'https:', 'ftp://'))) {
  233. $url = 'http://'.$url;
  234. }
  235. $extra = ($width > 0 ? 'width="'.$width.'" ' : '').($height > 0 ? 'height="'.$height.'" ' : '');
  236. return mobile_image($url, $extra);
  237. }
  238. function mobile_parsesmiles(&$message) {
  239. global $_G;
  240. static $enablesmiles;
  241. if($enablesmiles === null) {
  242. $url = !in_array(strtolower(substr(STATICURL, 0, 6)), array('http:/', 'https:', 'ftp://')) ? $_G['siteurl'] : '';
  243. $enablesmiles = false;
  244. if(!empty($_G['cache']['smilies']) && is_array($_G['cache']['smilies'])) {
  245. foreach($_G['cache']['smilies']['replacearray'] AS $key => $smiley) {
  246. $enablesmiles[$key] = '<img src="'.$url.STATICURL.'image/smiley/'.$_G['cache']['smileytypes'][$_G['cache']['smilies']['typearray'][$key]]['directory'].'/'.$smiley.'" />';
  247. }
  248. }
  249. }
  250. $enablesmiles && $message = preg_replace($_G['cache']['smilies']['searcharray'], $enablesmiles, $message, $_G['setting']['maxsmilies']);
  251. return $message;
  252. }
  253. function mobile_parsetable($width, $bgcolor, $message) {
  254. if(strpos($message, '[/tr]') === FALSE && strpos($message, '[/td]') === FALSE) {
  255. $rows = explode("\n", $message);
  256. $s = '<ul>';
  257. foreach($rows as $row) {
  258. $s .= '<li>'.str_replace(array('\|', '|', '\n'), array('&#124;', '</li><li>', "\n"), $row).'</li>';
  259. }
  260. $s .= '</ul>';
  261. return $s;
  262. } else {
  263. if(!preg_match("/^\[tr(?:=([\(\)\s%,#\w]+))?\]\s*\[td([=\d,%]+)?\]/", $message) && !preg_match("/^<tr[^>]*?>\s*<td[^>]*?>/", $message)) {
  264. return str_replace('\\"', '"', preg_replace("/\[tr(?:=([\(\)\s%,#\w]+))?\]|\[td([=\d,%]+)?\]|\[\/td\]|\[\/tr\]/", '', $message));
  265. }
  266. $message = preg_replace_callback("/\[tr(?:=([\(\)\s%,#\w]+))?\]\s*\[td(?:=(\d{1,4}%?))?\]/i", 'mobile_parsetable_callback_mobile_parsetrtd_12', $message);
  267. $message = preg_replace_callback("/\[\/td\]\s*\[td(?:=(\d{1,4}%?))?\]/i", 'mobile_parsetable_callback_mobile_parsetrtd_1', $message);
  268. $message = preg_replace_callback("/\[tr(?:=([\(\)\s%,#\w]+))?\]\s*\[td(?:=(\d{1,2}),(\d{1,2})(?:,(\d{1,4}%?))?)?\]/i", 'mobile_parsetable_callback_mobile_parsetrtd_1234', $message);
  269. $message = preg_replace_callback("/\[\/td\]\s*\[td(?:=(\d{1,2}),(\d{1,2})(?:,(\d{1,4}%?))?)?\]/i", 'mobile_parsetable_callback_mobile_parsetrtd_123', $message);
  270. return '<table class="dzcode_table" cellspacing="0" '.
  271. ($bgcolor ? ' bgcolor="'.$bgcolor.'">' : '>').
  272. str_replace('\\"', '"', preg_replace("/\[\/td\]\s*\[\/tr\]\s*/i", '</td></tr>', $message)
  273. ).'</table>';
  274. }
  275. }
  276. function mobile_parsetable_callback_mobile_parsetrtd_12($matches) {
  277. return mobile_parsetrtd($matches[1], 0, 0, $matches[2]);
  278. }
  279. function mobile_parsetable_callback_mobile_parsetrtd_1($matches) {
  280. return mobile_parsetrtd('td', 0, 0, $matches[1]);
  281. }
  282. function mobile_parsetable_callback_mobile_parsetrtd_1234($matches) {
  283. return mobile_parsetrtd($matches[1], $matches[2], $matches[3], $matches[4]);
  284. }
  285. function mobile_parsetable_callback_mobile_parsetrtd_123($matches) {
  286. return mobile_parsetrtd('td', $matches[1], $matches[2], $matches[3]);
  287. }
  288. function mobile_parsetrtd($bgcolor, $colspan, $rowspan, $width) {
  289. return ($bgcolor == 'td' ? '</td></tr>' : '<tr'.($bgcolor ? ' style="background-color:'.$bgcolor.'"' : '').'>').'<td class="dzcode_td">';
  290. }
  291. function mobile_parseed2k($url) {
  292. global $_G;
  293. list(,$type, $name, $size,) = explode('|', $url);
  294. $name = addslashes($name);
  295. if($type == 'file') {
  296. return '<a ed2k="'.urlencode($url).'">'.$name.' ('.sizecount($size).')</a>';
  297. } else {
  298. return '<a ed2k="'.urlencode($url).'">'.$url.'</a>';
  299. }
  300. }
  301. ?>