一般情况下先用PHP的 strip_tags 函数去掉所有html标签,再去掉空格等,然后再用substr或者自己实现的cn_substr函数来实现截取。因为如果不先去掉html标签,直接截取出来的字符串就会有没有闭合的标签出现,有时甚至会截取在标签上面比如
复制代码 代码如下: </di ...
今天遇到一个内容翻页截取问题: 正文是用富文本编辑器写入的,编辑器上有个分页按钮,点击之后就往当前光标位置插入一个蓝色的
复制代码 代码如下: <hr />
横线。然后php直接存入数据库。显示的时候,用 explode 函数根据这个
复制代码 代码如下: <hr />
标记来分成一个数组,然后根据当前页码来显示某个片段。 但是有个严重的问题,比如富文本编辑器写入:
复制代码 代码如下:
<div style="text-align:center">
content of page 1
<hr />
page 2 content
</div>
如果用explode函数分开后,
第一页的内容是
复制代码 代码如下:
<div style="text-align:center">
content of page 1
第二页的内容是:
复制代码 代码如下:
page 2 content
</div>
这样就产生了没有闭合的标签,直接显示到页面上面就会破坏页面布局。。。
想了很久,也找了网上很多 closetag函数。但是发现都针对第一页那种没有闭合的标签的闭合。对于第二种没有开头的标签就没办法了。
针对第一页那种没有闭合的标签的闭合的closetags方法是:
复制代码 代码如下:
function closetags($html) {
// 不需要补全的标签
$arr_single_tags = array('meta', 'img', 'br', 'link', 'area');
// 匹配开始标签
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];
// 匹配关闭标签
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
// 计算关闭开启标签数量,如果相同就返回html数据
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;
}
// 把排序数组,将最后一个开启的标签放在最前面
$openedtags = array_reverse($openedtags);
// 遍历开启标签数组
for ($i = 0; $i < $len_opened; $i++) {
// 如果需要补全的标签
if (!in_array($openedtags[$i], $arr_single_tags)) {
// 如果这个标签不在关闭的标签中
if (!in_array($openedtags[$i], $closedtags)) {
// 直接补全闭合标签
$html .= '</' . $openedtags[$i] . '>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
后来想了一个办法,利用浏览器自己的html解释引擎来帮助补全有问题的html片段。具体做法如下:
复制代码 代码如下:
<script>
var div = document.createElement('div');
div.innerHTML ='<?php echo ("<div>这里是被截取的html片段");?>';
document.write(div.innerHTML);
</script>
原理就是先把html片段写入到一个空的div里面,然后再从这个div里面读取出来。别看写入和读取的属性都是innerHTML,写入的内容和得到的内容是不一样的噢。如果写入不完整的html片段,浏览器会自动补全修正。读取出来的时候就已经是完整的html dom 片段了。
可是这样有个弊端,由于是Js加载内容信息的,会对搜索引擎优化不好。
复制代码 代码如下: </di ...
今天遇到一个内容翻页截取问题: 正文是用富文本编辑器写入的,编辑器上有个分页按钮,点击之后就往当前光标位置插入一个蓝色的
复制代码 代码如下: <hr />
横线。然后php直接存入数据库。显示的时候,用 explode 函数根据这个
复制代码 代码如下: <hr />
标记来分成一个数组,然后根据当前页码来显示某个片段。 但是有个严重的问题,比如富文本编辑器写入:
复制代码 代码如下:
<div style="text-align:center">
content of page 1
<hr />
page 2 content
</div>
如果用explode函数分开后,
第一页的内容是
复制代码 代码如下:
<div style="text-align:center">
content of page 1
第二页的内容是:
复制代码 代码如下:
page 2 content
</div>
这样就产生了没有闭合的标签,直接显示到页面上面就会破坏页面布局。。。
想了很久,也找了网上很多 closetag函数。但是发现都针对第一页那种没有闭合的标签的闭合。对于第二种没有开头的标签就没办法了。
针对第一页那种没有闭合的标签的闭合的closetags方法是:
复制代码 代码如下:
function closetags($html) {
// 不需要补全的标签
$arr_single_tags = array('meta', 'img', 'br', 'link', 'area');
// 匹配开始标签
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];
// 匹配关闭标签
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
// 计算关闭开启标签数量,如果相同就返回html数据
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;
}
// 把排序数组,将最后一个开启的标签放在最前面
$openedtags = array_reverse($openedtags);
// 遍历开启标签数组
for ($i = 0; $i < $len_opened; $i++) {
// 如果需要补全的标签
if (!in_array($openedtags[$i], $arr_single_tags)) {
// 如果这个标签不在关闭的标签中
if (!in_array($openedtags[$i], $closedtags)) {
// 直接补全闭合标签
$html .= '</' . $openedtags[$i] . '>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
后来想了一个办法,利用浏览器自己的html解释引擎来帮助补全有问题的html片段。具体做法如下:
复制代码 代码如下:
<script>
var div = document.createElement('div');
div.innerHTML ='<?php echo ("<div>这里是被截取的html片段");?>';
document.write(div.innerHTML);
</script>
原理就是先把html片段写入到一个空的div里面,然后再从这个div里面读取出来。别看写入和读取的属性都是innerHTML,写入的内容和得到的内容是不一样的噢。如果写入不完整的html片段,浏览器会自动补全修正。读取出来的时候就已经是完整的html dom 片段了。
可是这样有个弊端,由于是Js加载内容信息的,会对搜索引擎优化不好。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
更新日志
2024年05月08日
2024年05月08日
- dnf时空石哪里爆的多
- 大受日本玩家欢迎!《剑星》在东京的多家商店被售空
- Steam特惠:EA发行商特卖!《女神异闻录5R》只要100多
- PC《对马岛之魂》来啦!5月最值得期待的15款新游戏
- 云水谣《小调江南1·醉声梦色》APE+CUE
- 新世纪天籁《BRAVENEWMUSIC》[低速原抓WAV+CUE]
- 新世纪天籁《BRAVENEWMUSIC》[低速原抓WAV+CUE]
- 《死亡搁浅2》女主艾丽·范宁新造型:魅力修身晚礼服
- 《哈迪斯2》Steam好评如潮!依旧爽快 全方面进化
- 尼古拉斯·凯奇长子殴打母亲被查 曾被送入精神病院
- 群星.2007-被遗忘的时光2辑4CD【华纳】【WAV+CUE】
- 蔡小虎.2008-出卖【豪记】【WAV+CUE】
- 群星.2024-完全省钱恋爱手册原创剧集原声带【华纳】【FLAC分轨】
- 重云角色培养心得,重云角色武器选择推荐
- 菲谢尔角色玩法推荐,菲谢尔角色天赋技能