在使用帝国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),错是没有错,不是多此一举吗?
|