学习笔记

  > PHP正则表达式处理img的地址

PHP正则表达式处理img的地址

今天更新了,CAIcms中的article中的删除,之前一直没有对article中的图片进行删除

首先包含本身字段的删除,当然也包含对body的删除。

使用unlink可以对物理地址进行删除。

在CI框架中,主要使用了正则,在删除文章的时候进行删除body中的src路径。

preg_match_all('/<img((?!src).)*src[\s]*=[\s]*[\'"](?<src>[^\'"]*)[\'"]/i',$row_data['body'],$match);

主要是这句,我们需要得到的是src的地址,这样通过vardump很容易得到。

贴出这个方法。

我的文章都存在了articles和article_data里面。

public function delete($id)
{
	if ( empty($id) ) exit();
	$row = $this->db->select('pic')->where('id',$id)->get($this->table1)->row_array();
	if ( !empty($row['pic']) ) unlink(".".$row['pic']);
	$res = $this->db->delete($this->table1,array('id'=>$id));
	$row_data = $this->db->select('body')->where('aid',$id)->get($this->table2)->row_array();
	preg_match_all('/<img((?!src).)*src[\s]*=[\s]*[\'"](?<src>[^\'"]*)[\'"]/i',$row_data['body'],$match);
	if ( is_array($match[2]) and count($match[2]) > 0 ) 
	{
		foreach ($match[2] as $v) { unlink(".".$v); }
	}
	
	$res_data = $this->db->delete($this->table2,array('aid'=>$id));
	return 1;
}

由于match得到的是一个2维数组,所以要仔细判断。这里match[2]即为我们希望得到的数据。

然后循环删除之。结束。


一个疑问,如果对方很蛋疼的使用退格键,就没有办法处理这种情况。

如果想继续处理,就需要最后,把所有的body重新遍历一遍,然后进行注意对比,然后再删除,从物理路径去考虑。

还有第二个疑问,如果对方是网络路径,那么,这个正则还需要进行变形。

if ( is_array($match[2]) and count($match[2]) > 0 ) 
{
    foreach ($match[2] as $v) 
    { 
	if (strpos($v, 'http')) continue;
	unlink(".".$v); 	
    }
}

结束。

发布时间:2018-04-25,18:20:56

删除文章的同时删除文中的图片地址。

作者:澎蠡

让学习成为一种习惯,让知识交流变成一种生活方式。