首页 > 其他 > 网站日记>正文

帝国cms取第一张内容图片为标题图片兼谈零宽断言

提示: 阅读权限:公开  

在使用帝国cms的编辑器的时候,你可以选择取某一张上传图片为标题图片。

但是在如果使用了第三方存储,或者借用外部的图片,那就是没有上传图片了。

没有上传图片,但是又想取得内容图片为标题图片!

这样的需要您有木有?有没有?有木有?


实现方法如下:

第一步 给编辑器增加一个开关,默认选中,取第一张内容图片为标题图片

<input name="jhctitlepic" type="checkbox" id="jhctitlepic" value="1" checked >取第一张内容图片为标题图片

第二步 增加一个自定义函数,提取内容中第一张图片的地址

// 取第一张内容图片为标题图片
function jhctitlepic($mid,$f,$isadd,$isq,$value,$cs){
	if(!$_POST['jhctitlepic'])return $value;
        if(!empty($value))return $value;
	$newstext=stripslashes($_POST['newstext']);
        $pattern = '/<img(?=s).*?(?<=s)src="(.+?)"/i'; 
	preg_match($pattern, $newstext, $matches); 
        if($matches){
                return $matches[1];//返回第一张图片地址
        }else{
                return $value;
        }
}

第三步 把这个自定义函数,绑定为titlepic字段的字段处理函数


这样就ok了。也没有什么技术难度,让我觉得有意思的是,我在网络没有找到满意的提取图片地址的正则,只好自己写一个。


 '/<img(?=s).*?(?<=s)src="(.+?)"/i';


这个正则使用了零宽断言,我们一起来赏析一下。

开始是个单引号,因为我把这个正则字符串放到了单引号中,原因是里边有双引号,如果你用双引号扩它的话,还要转义。

随后的斜杠是正则开始的标志,也可以是别的字符,只要前后一致就可以。就是说,我也可以这样写:

 '#<img(?=s).*?(?<=s)src="(.+?)"#i';

<img是图片的html标签特征,后边必须匹配一个空格!这里使用了后断言

(?=s)

s其实就是s,也就是空格。因为单引号字符串的反斜杠需要转义,所以写了两个算一个。?=表示<img的后边,要求是个空格。这个匹配虽然扩在圆括号中,但是它不会出现在匹配结果中,也不消耗字符串。

.*?

都懂啊,表示任意的字符若干个,附加的问号,解除贪婪属性,赋予懒惰属性,说白了就是尽量匹配的短(lazy)点

(?<=s)src=

又来一个断言,她在圆括号中,问号小于等于开头,表示这是个前置的断言,就是要求src=前边有个空格,这非常重要,img标签中最近有个data-src属性你造梦?不要求这个空格可能提取到你不需要的。


"(.+?)"/i';

呵呵,主菜来了,.+?就是任意字符匹配一个或者很多个,但是别贪,碰见双引号就结束。这个就是$matches[1]的值。那么$matches[0]是什么?老司机都知道的。最后的i表示大小写通吃,我经常看见有人最后加了i,但是前头还这样写<(img|IMG),错是没有错,不是多此一举吗?



上一篇:帝国cms之模型导入导出的噩梦

下一篇:想不到php中的list可以这样用,不需要的就不要

tags: 帝国cms 图片 帝国

返回首页

相关

热门

站内直通车

[!--temp.bottomnav--]
返回顶部