php html内容分页,PHP_包涵HTML标记的内容分页,最近网站要做静态生成内容必 - phpStudy...

包涵HTML标记的内容分页

最近网站要做静态生成内容必须分页所以在网上找了N多实例都不理想,所以花了点时间自己写了个方法

目前来说没发现什么问题(已用方法生成20W个html)

所以把代码贴出来与大家分享。

不足之处或有更好的方法请大家告知我不胜感激。

图片看不清楚?请点击这里查看原图(大图)。

调用ArrayList arrlt=ContentPage.GetPageContent("分页内容", 分页大小,true);

1using System;

2using System.Text;

3using System.Collections;

4using System.Text.RegularExpressions;

5

6    /**

7    /// 内容分页 v0.1.2     gxian22@163.com

8    ///

9public class ContentPage

10{

11    /**

12    /// 内容分页

13    ///

14    /// 要分页的字符串内容

15    /// 分页大小

16    /// 最后一页字符小于intPageSize的1/4加到上一页

17    ///

18    public static ArrayList GetPageContent(string strContent, int intPageSize, bool isOpen)

19    {

20        ArrayList arrlist = new ArrayList();

21        string strp = strContent;

22        int num = RemoveHtml(strp.ToString()).Length;//除html标记后的字符长度

23        int bp = (intPageSize + (intPageSize / 5));

24

25        for (int i = 0; i < ((num % bp == 0) ? (num / bp) : ((num / bp) + 1)); i++)

26        {

27            arrlist.Add(SubString(intPageSize, ref strp));

28            num = RemoveHtml(strp.ToString()).Length;

29            if (isOpen && num < (intPageSize / 4))

30            { // 小于分页1/4字符加到上一页

31                arrlist[arrlist.Count - 1] = arrlist[arrlist.Count - 1] + strp;

32                strp = "";

33            }

34            i = 0;

35        }

36        if (strp.Length > 0) arrlist.Add(strp); //大于1/4字符 小于intPageSize

37

38        return arrlist;

39    }

40

41    /**

42    /// < 符号搜索

43    ///

44    ///

45    ///

46    private static bool IsBegin(char cr)

47    {

48        return cr.Equals('

49    }

50

51    /**

52    /// > 符号搜索

53    ///

54    ///

55    ///

56    private static bool IsEnd(char cr)

57    {

58        return cr.Equals('>');

59    }

60

61    /**

62    /// 截取分页内容

63    ///

64    /// 每页字符长度

65    ///

66    ///

67    private static string SubString(int index, ref string str)

68    {

69        ArrayList arrlistB = new ArrayList();

70        ArrayList arrlistE = new ArrayList();

71        string strTag = "";

72        char strend = '0';

73        bool isBg = false;

74        bool IsSuEndTag = false;

75

76        index = Gindex(str, index);

77        string substr = CutString(str, 0, index); //截取分页长度

78        string substr1 = CutString(str, index, str.Length - substr.Length); //剩余字符

79        int iof = substr.LastIndexOf("

80

81        防止标记截断#region 防止标记截断

82

83        if (iof > 0) iof1 = CutString(substr, iof, substr.Length - iof).IndexOf(">"); // 标记是否被截断

84        if (iof1 < 0) //完整标记被截断,则重新截取

85        {

86            index = index + substr1.IndexOf(">") + 1;

87            substr = CutString(str, 0, index);

88            substr1 = CutString(str, index, str.Length - substr.Length);

89        }

90

91        int indexendtb = substr.LastIndexOf("");

92        if (indexendtb >= 0)

93        {

94            substr = CutString(str, 0, indexendtb);

95            substr1 = CutString(str, indexendtb, str.Length - indexendtb);

96        }

97

98        int intsubstr = substr.LastIndexOf("/>") + 1;

99        int intsubstr1 = substr1.IndexOf("");

100        if (intsubstr >= 0 && intsubstr1 >= 0)   // 标记与 结束标记间是否字符 如:abc.jpg文字文字文字文字

101        {

102            string substr2 = CutString(substr, intsubstr, substr.Length - intsubstr) + CutString(substr1, 0, intsubstr1);

103            if (substr2.IndexOf('>') == -1 && substr2.IndexOf('

104            {

105                substr += CutString(substr1, 0, intsubstr1);

106                substr2 = CutString(substr1, intsubstr1, substr1.Length - intsubstr1);

107                int sub2idf = substr2.IndexOf('>');

108                substr += CutString(substr2, 0, sub2idf);

109                substr1 = CutString(substr2, sub2idf, substr2.Length - sub2idf);

110            }

111        }

112        #endregion

113

114        //分析截取字符内容提取标记

115        foreach (char cr in substr)

116        {

117            if (IsBegin(cr)) isBg = true;

118            if (isBg) strTag += cr;

119

120            if (isBg && cr.Equals('/') && strend.Equals('

121

122            if (IsEnd(cr))

123            {

124                if (strend.Equals('/')) //跳出 标记

125                {

126                    isBg = false;

127                    IsSuEndTag = false;

128                    strTag = "";

129                }

130

131                if (isBg)

132                {

133                    if (!CutString(strTag.ToLower(), 0, 3).Equals("

134                    {

135                        if (IsSuEndTag)

136                            arrlistE.Add(strTag); //结束标记

137                        else

138                            arrlistB.Add(strTag); //开始标记

139                    }

140                    IsSuEndTag = false;

141                    strTag = "";

142                    isBg = false;

143                }

144            }

145            strend = cr;

146        }

147

148        //找到未关闭标记

149        for (int b = 0; b < arrlistB.Count; b++)

150        {

151            for (int e = 0; e < arrlistE.Count; e++)

152            {

153                string strb = arrlistB[b].ToString().ToLower();

154                int num = strb.IndexOf(' ');

155                if (num > 0) strb = CutString(strb, 0, num) + ">";

156                if (strb.ToLower().Replace("

157                {

158                    arrlistB.RemoveAt(b);

159                    arrlistE.RemoveAt(e);

160                    b = -1;

161                    break;

162                }

163            }

164        }

165

166        //关闭被截断标记

167        for (int i = arrlistB.Count; i > 0; i--)

168        {

169            string stral = arrlistB[i - 1].ToString();

170            substr += (stral.IndexOf(" ") == -1 ? stral.Replace(">", "/>") : CutString(stral, 0, stral.IndexOf(" ")) + "/>");

171        }

172        //补全上页截断的标签

173        string strtag = "";

174        for (int i = 0; i < arrlistB.Count; i++) strtag += arrlistB[i].ToString();

175

176        str = strtag + substr1; //更改原始字符串

177        return substr; //返回截取内容

178    }

179

180    /**

181    /// 返回真实字符长度

182    ///

183    ///

184    ///

185    ///

186    private static int Gindex(string str, int index)

187    {

188        bool isBg = false;

189        bool isSuEndTag = false;

190        bool isNbsp = false, isRnbsp = false; ;

191        string strnbsp = "";

192        int i = 0, c = 0;

193        foreach (char cr in str)

194        {

195            if (!isBg && IsBegin(cr)) { isBg = true; isSuEndTag = false; }

196            if (isBg && IsEnd(cr)) { isBg = false; isSuEndTag = true; }

197            if (isSuEndTag && !isBg)

198            { //不在html标记内

199                if (cr.Equals('&')) isNbsp = true;

200                if (isNbsp)

201                {

202                    strnbsp += cr.ToString();

203                    if (strnbsp.Length > 6) { isNbsp = false; strnbsp = ""; }

204                    if (cr.Equals(';')) isNbsp = false;//

205                }

206                if (!isNbsp && !"".Equals(strnbsp)) isRnbsp = strnbsp.ToLower().Equals(" ");

207            }

208

209            if (isSuEndTag && !cr.Equals('n') && !cr.Equals('r') && !cr.Equals(' ')) c++;

210            if (isRnbsp) { c = c - 6; isRnbsp = false; strnbsp = "";  }

211

212            i++;

213

214            if (c == index) return i;

215        }

216        return i;

217    }

218

219    /**

220    /// 移除Html标记

221    ///

222    ///

223    ///

224    public static string RemoveHtml(string content)

225    {

226        content = Regex.Replace(content, @"]*>", string.Empty, RegexOptions.IgnoreCase);

227        return Regex.Replace(content, " ", string.Empty, RegexOptions.IgnoreCase);

228    }

229

230    /**

231    /// 从字符串的指定位置截取指定长度的子字符串

232    ///

233    /// 原字符串

234    /// 子字符串的起始位置

235    /// 子字符串的长度

236    /// 子字符串

237    public static string CutString(string str, int startIndex, int length)

238    {

239        if (startIndex >= 0)

240        {

241            if (length < 0)

242            {

243                length = length * -1;

244                if (startIndex - length < 0)

245                {

246                    length = startIndex;

247                    startIndex = 0;

248                }

249                else

250                {

251                    startIndex = startIndex - length;

252                }

253            }

254

255            if (startIndex > str.Length) return "";

256

257        }

258        else

259        {

260            if (length < 0)

261            {

262                return "";

263            }

264            else

265            {

266                if (length + startIndex > 0)

267                {

268                    length = length + startIndex;

269                    startIndex = 0;

270                }

271                else

272                {

273                    return "";

274                }

275            }

276        }

277

278        if (str.Length - startIndex < length) length = str.Length - startIndex;

279        try

280        {

281            return str.Substring(startIndex, length);

282        }

283        catch

284        {

285            return str;

286        }

287    }

288}

289相关阅读:

Blitz templates 最快的PHP模板引擎

浅析Java中Data类的应用

Linux中网络字节序和主机字节序

Firefox 无法获取cssRules 的解决办法

javascript 字符串连接的性能问题(多浏览器)

CSS语法手册(六)分类属性

编写更优美的网页:精心设计的 CSS 框架可节省时间和工作

firefox getyear() getFullYear数获取年份的问题

剖析ASP.NET读取XML文件4种方法

CSS教程:汇总CSS属性的缩写

SQL Server安全性的终极禁忌:被忽视的系统

linux下删除乱码文件名的方法

ASP伪造REFERER

在Fedora 9下面配置ISATAP IPV6 tunnel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值