例如这篇文章:http://wf.wenming.cn/wfwlwmcb/201906/t20190604_5887051.shtml
图片处代码:
<img width="600" alt="" oldsrc="W020190605390138630908.jpg" complete="complete" src="http://wf.wenming.cn/wfwlwmcb/201906/W020190605390138630908.jpg" style="margin: 0px; padding: 0px; border: 0px; vertical-align: bottom; max-width: 85%;">
里面含有oldsrc属性,点击远程图片下载未能正常工作,在编辑源码里把oldsrc="W020190605390138630908.jpg"去掉,功能正常。猜想是不是在src的匹配上不够精准?
此问题在https://gitee.com/ComsenzDiscuz/DiscuzX提出issues,燃鹅两个多月没人鸟。只好愤然自己找BUG修BUG了。
这一过程说起来辛酸辛苦,不是专业开发略懂皮毛的我,先从学chrome开发者工具开始。。发现不在JS端在后台。。后台又找了N久。。最终根据某个漏洞信息猜到了地方forum_ajax.php和\source\include\portalcp\portalcp_upload.php
} elseif($_GET['action'] == 'downremoteimg') {
if(!$_G['group']['allowdownremoteimg']) {
dexit();
}
$_GET['message'] = str_replace(array("\r", "\n"), array($_GET['wysiwyg'] ? '<br />' : '', "\\n"), $_GET['message']);
preg_match_all("/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]|\[img=\d{1,4}[x|\,]\d{1,4}\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/is", $_GET['message'], $image1, PREG_SET_ORDER);
preg_match_all("/\<img.+src=('|\"|)?(.*)(\\1)([\s].*)?\>/ismUe", $_GET['message'], $image2, PREG_SET_ORDER);
$temp = $aids = $existentimg = array();
if(is_array($image1) && !empty($image1)) {
foreach($image1 as $value) {
$temp[] = array(
'0' => $value[0],
'1' => trim(!empty($value[1]) ? $value[1] : $value[2])
);
}
}
最后。。。就是个正则表达式的问题(其中各种DEBUG辛苦和技巧省略了数百字),shit!这么牛逼的正则表达式都能写得出,居然还有BUG?这是故意留坑的么?
/\<img.+src=('|\"|)?(.*)(\\1)([\s].*)?\>/ismUe
改为
/\<img.+\bsrc\b\s*=('|\"|)?(.*)(\\1)([\s].*)?\>/ismUe
一开始猜的没错,精准匹配src后,再增加等号前的空格等符号宽容度,解决问题!
PS:经过测试,依然有个遗憾的地方就是微信公众号文章的图片没法下载,因为图片做了防盗链,服务器端下载图片链接提示不存在。下载方式还不是很完美。