网站后台中对html标签的处理

最近做一个CMS,后台中需要使用在线编辑器对新闻进行编辑,然后发表。我用的在线编辑器是CKEditor+CKFinder。也许是我为了让CKEditor更本地化吧,改了很多。后来发现在CKEditor中对文字设置字体、颜色、字号大小时文字的<span>标签会出现N个的嵌套。我们知道,当span标签以嵌套方式出现的时候,它往往是以最后一个span标签的style方式显示的。也就是说外面的span标签的style就都被屏蔽了。这个让人有点郁闷~~.

      一开始想的解决办法是自己在其中查找span标签然后进行处理,但是想不好怎么解决嵌套的问题。后来琢磨使用正则表达式,也在网上查了很多资料。结果发现正则表达式真的复杂得头疼,而且其实也无法很好地处理嵌套标签的问题。

      一个偶然的机会~~(这句话听得很耳熟),我看到有人建议使用XmlDocument来进行处理。 我恍然大悟,我心里在呐喊:我的“病”有救了(还好面对的不是电线杆~~~~)。当然,使用XmlDocument之前你需要把CKEditor中的字符串处理一下,也就是符合xml规范。这个很简单,只要在外面加一个<div>标签作为根节点就成了。下面就贴上代码:

ExpandedBlockStart.gifView Code 
 1     string content = "<div>" + BulletinBodyTxt.Text + "</div>";
 2     var doc = new XmlDocument();
 3     doc.LoadXml(content);
 4     XmlNodeList nodes = doc.GetElementsByTagName("span");
 5 
 6     string style = string.Empty, preText = string.Empty;
 7     foreach (XmlNode node in nodes)
 8     {
 9         if (node.InnerText == preText)
10         {
11             if (node.Attributes != null &&
12                 style.IndexOf(node.Attributes["style"].Value, StringComparison.Ordinal) < 0)
13                 style += node.Attributes["style"].Value;
14         }
15         else
16         {
17             if (node.Attributes != null) style = node.Attributes["style"].Value;
18             preText = node.InnerText;
19         }
20         if (node.Attributes != null)
21         {
22             node.Attributes["style"].Value = style;
23         }
24         else
25         {
26             node.Attributes.Append(CreateAttribute(node, "style", style));
27             //node.Attributes.Append()
28         }
29     }
30

这其中会有判断如果span标签里attribute为空的情况,使用了一个私有的CreateAttribute方法进行添加,这个方法的代码如下:

ExpandedBlockStart.gifView Code 
 1     private XmlAttribute CreateAttribute(XmlNode node, string attributeName, string value)
 2     {
 3         try
 4         {
 5             XmlDocument doc = node.OwnerDocument;
 6             if (doc != null)
 7             {
 8                 XmlAttribute attr = doc.CreateAttribute(attributeName);
 9                 attr.Value = value;
10                 node.Attributes.SetNamedItem(attr);
11                 return attr;
12             }
13         }
14         catch (Exception err)
15         {
16             string desc = err.Message;
17         }
18         return null;
19

这样,这个问题就基本解决了。为什么说只是基本解决而不是根本解决?因为嵌套span还存在,只是把外层的style都写到最里层的style 里了。完美的做法是去掉嵌套,只保留一个span。这个因为时间原因就暂且留到日后解决吧。

转载于:https://www.cnblogs.com/eliminator/archive/2012/07/28/2613391.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Calendar getActualMaximum()方法与示例

日历类的getActualMaximum()方法 (Calendar Class getActualMaximum() method) getActualMaximum() method is available in java.util package. getActualMaximum()方法在java.util包中可用。 getActualMaximum() method is used to return the maximum value that the given …

软件研发人员考核的十项基本原则(转)

软件研发人员考核的十项基本原则 作者: 任甲林 来源: 万方数据 软件研发人员的考核一直是软件企业管理的难点笔者在长期的研发管理实践与咨询实践中总结了进行软件研发人员考核的一些基本原则。(1) 要体现公司的价值观公司的价值观体现了公司认可什么类型的人员&#xff1f;…

2012.7.24---C#(2)

学习过了C#的基本属性函数后&#xff0c;接下来的学习我觉得比较重要。C#是一种面向对象的语言&#xff0c;下面复习一下面向对象中的一些名词。 类&#xff1a;把一些系列东西&#xff0c;把他们的共同的属性和方法抽象出来&#xff0c;给他起一个名字就是XXX类。类中定义…

汇编语言-001(BYTE、DUP、WORD 、DWORD 、QWORD 、TBYTE 、REAL )

1 : 基础汇编语言展示 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCmov eax,5add eax,6INVOKE ExitProcess,0 main ENDP END main2:基础汇编语言展示增加变量的访问 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dw…

<各国地图轮廓app>技术支持

如在app使用过程中遇到任何问题&#xff0c;请与开发者联系caohechunhotmail.com

Java BigDecimal longValueExact()方法与示例

BigDecimal类longValueExact()方法 (BigDecimal Class longValueExact() method) longValueExact() method is available in java.math package. longValueExact()方法在java.math包中可用。 longValueExact() method is used to convert this BigDecimal to an exact long val…

c#中的多线程同步

在处理多线程同步问题的时候&#xff0c;我们一般有临界区&#xff0c;互斥量&#xff0c;信号量和消息机制等几种解决方案&#xff0c;在c#中可以非常方便的使用它们来实现进程的同步。下面我就常用的lock,Monitor和Mutex几种来说明如何实现进程的同步。 lock和Monitor依靠一种…

ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“

windows下&#xff1a; ffplay 提示"SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can’t initialize audio client" 添加环境变量&#xff1a;SDL_AUDIODRIVERdirectsound

js 正则表达式,正整数

var ss "3.333";var type /^[0-9]*[1-9][0-9]*$/;var re new RegExp(type);alert(ss.match(re));if (ss.match(re) null) {alert("请输入大于零的整数!");return;} 转载于:https://www.cnblogs.com/lingxzg/archive/2012/08/02/2620543.html

java 根据类名示例化类_Java即时类| EpochSecond()方法的示例

java 根据类名示例化类EpochSecond()方法的即时类 (Instant Class ofEpochSecond() method) Syntax: 句法&#xff1a; public static Instant ofEpochSecond(long sec_val);public static Instant ofEpochSecond(long sec_val, long nanos_adjust);ofEpochSecond() method is…

java中Date()类型输入数据的处理

对于Date类型的数据&#xff0c;需要输入生日存入相应数据库中 private Date birthday;// 生日package com.pdsu.mybatis.pojo;import java.io.Serializable; import java.util.Date;public class User implements Serializable {/*** */private static final long serialVers…

(扩展)欧几里德快速幂

GCD模板 __int64 gcd(__int64 a,__int64 b) {return b0? a:gcd(b,a%b); } 欧几里德算法又称辗转相除法&#xff0c;用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理&#xff1a; gcd函数就是用来求(a,b)的最大公约数的。 gcd函数的基本性质&#xff1a; gcd(a,…

汇编语言-002(.data、Equal、$、EQU 、MOV 、MOVSX、MOVZX)

1&#xff1a;变量相加程序 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data firstval DWORD 20002000h secondval DWORD 11111111h thirdval DWORD 22222222h sum DWORD 0.code main PROCmov eax,firstvaladd eax,secondvaladd eax,thirdvalm…

\r与\n的区别,\r\n与\n或\r的区别(C语言/C#)

本文出处http://topic.csdn.net/t/20020718/07/882679.html 原作者:triout&#xff08;笨牛&#xff09; \r表示回车&#xff0c;\n表示换行&#xff0c;我们按回车按钮的时候&#xff0c;系统自动产生回车和换行两个字符&#xff1a; 回车仅仅是表示完成&#xff0c;把光…

通过ID查询一个用户的两种开发方法

通过ID查询一个用户的两种开发方法 数据库建表sql语句如下&#xff1a;https://github.com/beyondyanyu/Sayingyy/blob/master/JDBC2-数据库sql建表语句 ①&#xff0c;原始Dao开发&#xff1a; UserDao.java&#xff08;接口&#xff09;: package com.pdsu.mybatis.dao;i…

duration java_Java Duration类| minusMinutes()方法与示例

duration java持续时间类minusMinutes()方法 (Duration Class minusMinutes() method) minusMinutes() method is available in java.time package. minusMinutes()方法在java.time包中可用。 minusMinutes() method is used to subtract the given duration in minutes from t…

Silverlight + WCF异步调用 例子

看大家好像对我的NParsing框架不是很感兴趣&#xff08;写NParsing帖没人顶我&#xff09;&#xff0c;那就给大家来点“甜品”&#xff0c;换换口谓。来说说Silverlight方面的东西。 在Silverlight中数据通信只能用异步。有人会觉得写起来很麻烦&#xff0c;其实不然。也有很简…

我博客主页的搜索功能怎么不好用

用博客里面的搜索功能&#xff0c;“找找看”&#xff0c;搜索我博客里面的关键字&#xff0c;但是不能出现结果。但是我在别人的主页上能够搜索该人的内容&#xff0c;能够查询到记录&#xff0c;难道博客园对每个博客的信息要先排序&#xff1f;目前我的还不在他的搜索数据库…

小议SqlMapConfig.xml配置文件

①、mybatis-3-config.dtd 主要用于mybatis的核心配文件sqlMapConfig.xml的约束 sqlMapConfig.xml代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN&q…

ffmepg 命令提取音视频数据

原文件&#xff1a; 1&#xff1a; 原音频数据提取&#xff08;保留还是mp4的封装格式的&#xff09;&#xff1a; ffmpeg -i test_1920x1080.mp4 -acodec copy -vn audio.mp4 -vn 就是没有视频&#xff0c; -acodec copy 音频拷贝不进行任何转码 原视频数据提取&#xff0…