前提:
1.博客首先系统自然是基于文本编辑器的,例如本博客是采用fckeditor。而文本编辑器提交时的文本是HTML格式的,将这个HTML格式文本直接以页面一部分显示,便可以实现文章的格式。
2.文章摘要是,截取文章中前面一小部分,用于显示在首页文章列表。点击文章链接,才可以看到文章全部。
3.博客系统,数据库里存储的是文章路径,而文章内容是存储在服务器本地目录下。根据1可知,文章内容是HTML格式的。
思路:
在上述前提2的基础上,我们可以设想在HTML格式文本的基础上该如何截取文章呢?如果截取前300字,恰巧将一个HTML的标签拦腰截断岂不尴尬?
在上述前提3的基础上,我们可以设想摘要该以怎样形式存储?
我的思路就是,为了获取摘要,有必要先将HTML标签都剔除掉,在纯净的文字基础上去截取前面300字符(Java String的substring()方法即可)。存储的话就是同样设立一个摘要的目录,采取数据库本地读写的形式。文章实体类多加一个摘要字段,存放摘要路径。之后主页显示的是Article实体类的摘要字段(本地目录读取)即可。查看文章内容则显示Article实体类的文章内容字段(本地目录读取)即可。
下面是除去HTML标签的公共方法(采用了复杂的正则,借鉴于网上):
/* * clean all the tags of HTML */ public static String removeTag(String htmlStr) { String regEx_script = "<script[^>]*?>[\s\S]*?<\/script>"; // script String regEx_style = "<style[^>]*?>[\s\S]*?<\/style>"; // style String regEx_html = "<[^>]+>"; // HTML tag String regEx_space = "\s+| | | ";// other characters Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE); Matcher m_script = p_script.matcher(htmlStr); htmlStr = m_script.replaceAll(""); Pattern p_style = Pattern .compile(regEx_style, Pattern.CASE_INSENSITIVE); Matcher m_style = p_style.matcher(htmlStr); htmlStr = m_style.replaceAll(""); Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE); Matcher m_html = p_html.matcher(htmlStr); htmlStr = m_html.replaceAll(""); Pattern p_space = Pattern .compile(regEx_space, Pattern.CASE_INSENSITIVE); Matcher m_space = p_space.matcher(htmlStr); htmlStr = m_space.replaceAll(" "); return htmlStr; }