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