让RSS和Archiver简易判断Discuz!代码

标签:Discuz!, PHP, RSS

Discuz!的RSS有个很大的毛病,如果出现了Discuz!代码,后面的内容就少了一大截,查了下rss.php,发现原来是个bug:
addslashes(cutstr(dhtmlspecialchars(preg_replace("/(\[.+\])/s", '', strip_tags(nl2br($thread['message'])))), 255));
/(\[.+\])/s进行的是贪婪匹配,因此一旦发现[字符,就会将最后一个]字符前的内容通通替换掉了。
虽然改成非贪婪模式只需要在+后加上?即可,判断关闭则可以换成/(\[\?.+?\])/s,但这样就无法进行多行匹配了。
于是可以把代码改成这样:
addslashes(cutstr(dhtmlspecialchars(stripDzTags(strip_tags(nl2br($thread['message'])))), 255));
然后在末尾的?>前加上stripDzTags函数
function stripDzTags($string) {
	$patterns = array ('/\[:.+?\]/', //这里是匹配表情,请确保自己的表情代码都是[:表情名]
		'/\[\/?url.*?\]/',
		'/\[\/?img.*?\]/',
		'/\[\/?media.*?\]/',
		'/\[\/?email.*?\]/',
		'/\[\/?align.*?\]/',
		'/\[\/?font.*?\]/',
		'/\[\/?size.*?\]/',
		'/\[\/?color.*?\]/',
		'/\[table.*?\].*?\[\/table.*?\]/s', //这里是把表格进行多行替换
		'/\[\/?flash\]/',
		'/\[\/?qq\]/',
		'/\[\/?sub\]/',
		'/\[\/?sup\]/',
		'/\[\/?mo\]/',
		'/\[\/?music\]/',
		'/\[\/?mp3\]/',
		'/\[\/?fly\]/',
		'/\[\/?code\]/',
		'/\[\/?quote\]/',
		'/\[attach\].*?\[\/attach.*?\]/', //替换附件
		'/\[\/?hide\]/',
		'/\[\/?b\]/',
		'/\[\/?i\]/',
		'/\[\/?u\]/');
	return preg_replace($patterns, '', $string);
}
然后再改Archiver模式。打开archiver/include/thread.inc.php,找到
$post['message'] = ($post['subject'] ? '<h3>'.$post['subject'].'</h3>' : '').nl2br
nl2br前面加上stripDzTags(
再往下找)));,添加一个括号,改成))));
然后仍是在末尾的?>前加上stripDzTags函数,不过内容要改改,主要是为了支持表格和附件
function stripDzTags($string) {
	$patterns = array ('/\[:.+?\]/',
		'/\[\/?url.*?\]/',
		'/\[\/?img.*?\]/',
		'/\[\/?media.*?\]/',
		'/\[\/?email.*?\]/',
		'/\[\/?align.*?\]/',
		'/\[\/?font.*?\]/',
		'/\[\/?size.*?\]/',
		'/\[\/?color.*?\]/',
		'/\[\/?flash\]/',
		'/\[\/?qq\]/',
		'/\[\/?sub\]/',
		'/\[\/?sup\]/',
		'/\[\/?mo\]/',
		'/\[\/?music\]/',
		'/\[\/?mp3\]/',
		'/\[\/?fly\]/',
		'/\[\/?code\]/',
		'/\[\/?quote\]/',
		'/\[\/?b\]/',
		'/\[\/?i\]/',
		'/\[\/?u\]/');
	$string = preg_replace($patterns, '', $string);
	$patterns = array ('/\[attach\].*?\[\/attach.*?\]/',
		'/\[table.*?\]/',
		'/\[tr\]/',
		'/\[td\]/',
		'/\[\/table\]/',
		'/\[\/tr\]/',
		'/\[\/td\]/');
	$replace = array ('<b>*** 附件 ***</b>',
		'<table>',
		'<tr>',
		'<td>',
		'</table>',
		'</tr>',
		'</td>');
	return preg_replace($patterns, $replace, $string);
}
此外,有兴趣的可以改成更好的实现方式,自己添加的Discuz!代码也能按这种方式替换。

忘说了,只在6.1版测试过,其他版本我没看。

0条评论 你不来一发么↓

    想说点什么呢?