本文实例讲述了php正则替换处理HTML页面的方法。分享给大家供大家参考。具体如下:
<?php
if(!defined('BASEPATH')) exit('No direct script access allowed');
/**
* HTML替换处理类,考虑如下几种替换
* 1. img src : '/]+?)/i'
* 2. a href : '/]+?)/i'
* 3. ifram.src : '/
* 4. frame src : '/]+?)/i'
* 5. js : '/window.open([( ]+?)([/'" ]+?)(.+?)([ )+?])/i'
* 6. css : '/background(.+?)url([( ])([/'" ]+?)(.+?)([ )+?])/i'
*/
class Myreplace {
private $moudle_array = array('udata','tdata','tresult','dresult');
private $content;
private $relative_dirname;
private $projectid;
private $moudle;
function __construct() {
$this->CI = &get_instance ();
}
/**
* 替换
* @param string $content HTML内容
* @param string $relative 相对路径
* @param int $projectid 项目id
* @moudle string $moudle 模板标识: udata,tdata,tresult,dresult
*/
public function my_replace($content,$relative,$projectid,$moudle) {
$this->content = $content;
$this->relative_dirname = $relative;
$this->projectid = $projectid;
if(in_array(strtolower($moudle),$this->moudle_array))
$this->moudle = $moudle;
else exit;
switch($this->moudle) {
case 'udata':
$this->CI->load->model('mupload_data','model');
break;
case 'tdata':
$this->CI->load->model('taskdata','model');
break;
case 'tresult':
$this->CI->load->model('taskresult','model');
break;
case 'dresult':
$this->CI->load->model('dmsresult','model');
break;
default:
break;
}
$pattern = '/]+?)/i';
$content = preg_replace_callback( $pattern, array($this, 'image_replace') , $content );
$pattern = '/]+?)/i';
$content = preg_replace_callback( $pattern, array($this, 'html_replace') , $content );
$pattern = '/
$content = preg_replace_callback( $pattern, array($this, 'iframe_replace') , $content );
$pattern = '/]+?)/i';
$content = preg_replace_callback( $pattern, array($this, 'frame_replace'), $content );
$pattern = '/window.open([( ]+?)([/'" ]+?)(.+?)([ )]+?)/i';
$content = preg_replace_callback( $pattern, array($this, 'js_replace'), $content );
$pattern = '/background(.+?)url([( ])([/'" ]+?)(.+?)([ )+?])/i';
$content = preg_replace_callback( $pattern, array($this, 'css_replace'), $content);
return $content;
}
private function image_replace($matches) {
if(count($matches) < 4) return '';
if( empty($matches[3]) ) return '';
$matches[3] = rtrim($matches[3],'/'"/');
//获取图片的id
$parent_dir_num = substr_count( $matches[3], '../');
$relative_dirname = $this->relative_dirname;
for($i=0; $i<$parent_dir_num; $i++) {
$relative_dirname = substr( $relative_dirname, 0, strrpos($relative_dirname,"/") );
}
$relativepath = rtrim($relative_dirname,'/') . '/'.ltrim($matches[3],'./');
$image_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid);
//输出
if( !empty($image_id) ) {
if($this->moudle == 'dresult') {
return "CI->config->item("base_url")."cdms/".$this->moudle."/readpic/$image_id?pid=".$this->projectid .$matches[2]. $matches[4];
} else {
return "CI->config->item("base_url")."cdms/".$this->moudle."/picfile/$image_id?pid=".$this->projectid .$matches[2]. $matches[4];
}
} else {
return "
}
}
private function html_replace( $matches ) {
if(count($matches) < 4) return '';
if( empty($matches[3]) ) return '';
//如果href的链接($matches[3])以http或www或mailto开始,则不进行处理
//if(preg_match('/^[http|www|mailto](.+?)/i',$matches[3]))
评论列表()