题目取得很中二,主要不知道咋取。原归正传,这两天遇到一个很奇怪的问题,ueditor在tp3.1.3下使用是完全正常的,把原来在tp3.1.3下使用正常的ueditor相关的所有文件拷贝到tp3.2.3环境下使用的时候,出现了这么个问题:例如我再ueditor编辑器里输入了下面的内容 我是测试文字
,
然后点击保存写入到数据库后再取出来就变成了
<p>我是测试文字</p>
很显然,多了两个p标签,再打开然后啥都不修改再保存一次就会变成下面这样
<p>我是测试文字</p>
再打开然后还不修改再保存,就变成下面这样:
&lt;p&gt;我是测试文字&lt;/p&gt;
乱码了是不是?问题是ueditor相关的所有文件都是从原来的项目里copy过来的,原来的项目里使用的时候是没有问题的,实例化ueditor编辑器的html代码也是从原来的项目里copy过来的,没有做任何改动,为什么在这个环境下就异常了呢?其实这里有两个原因,一个就是ueditor的问题,另外一个就是tp3.2.3的问题,ueditor默认会添加p标签,然后tp3.2.3在将数据写入数据库的时候会再过滤相关的html标签,将它们转化成html的字符实体。
以下是解决方案:
<!-- 加载编辑器的容器 -->
<script id="container" name="content" type="text/plain">
这里写你的初始化内容
</script>
把这段代码换成:
<textarea id="container" name="content" type="text/plain">这里加载你的HTML数据</textarea>
用textarea….反正问题解决了,应该是tp在插入数据的时候有对数据类型进行校验,如果是<script>
标签下的内容就会做更严格的校验和过滤。
更新:事实的真相就是tp3.2.3对数据的写入做了更严格的校验和过滤,输入的默认过滤函数是htmlspecialchars,所以为了能输出html的数据必须用htmlspecialchars_decode函数解析一下,即模板中数据的输出应当使用这样{$cont|htmlspecialchars_decode}
的方式,不然就会就会把tp过滤后的数据(在数据写入的时候,标签等特殊符号都已被htmlspecialchars函数过滤成字符实体了)直接输出。所以第二种解决方案就是在模板中输出数据的时候使用{$cont|htmlspecialchars_decode}
函数解析的方式输出。
参考文章:
ThinkPHP3.2.3配置UEditor