php正则替换处理HTML页面的方法 |
|
本文标签:php,正则替换,HTML页面 本文实例讲述了php正则替换处理HTML页面的方法 。分享给大家供大家参考 。具体如下:
<?php
if(!defined(BASEPATH)) exit(No direct script access allowed);
/**
* HTML替换处理类,考虑如下几种替换
* 1. img src : /<img(.+?)src=([\\" ])?(.+?)([ >]+?)/i
* 2. a href : /<a(.+?)href=([\\" ])?(.+?)([ >]+?)/i
* 3. ifram.src : /<iframe(.+?)src=([\\" ])?(.+?)([ >]+?)/i
* 4. frame src : /<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 = /<img(.+?)src=([\\" ])?(.+?)([ >]+?)/i;
$content = preg_replace_callback( $pattern, array($this, image_replace) , $content );
$pattern = /<a(.+?)href=([\\" ])?(.+?)([ >]+?)/i;
$content = preg_replace_callback( $pattern, array($this, html_replace) , $content );
$pattern = /<iframe(.+?)src=([\\" ])?(.+?)([ >]+?)/i;
$content = preg_replace_callback( $pattern, array($this, iframe_replace) , $content );
$pattern = /<frame(.+?)src=([\\" ])?(.+?)([ >]+?)/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 "<img".$matches[1]."src=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/readpic/$image_id?pid=".$this->projectid .$matches[2]. $matches[4];
} else {
return "<img".$matches[1]."src=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/picfile/$image_id?pid=".$this->projectid .$matches[2]. $matches[4];
}
} else {
return "<img".$matches[1]."src=".$matches[2].$matches[3].$matches[2].$matches[4];
}
}
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]))
// return "<a".$matches[1]."href=".$matches[2].$matches[3].$matches[4];
$matches[3] = rtrim($matches[3],\"/);
//处理锚点
if(substr_count($matches[3],#)>0)
$matches[3] = substr($matches[3],0,strrpos($matches[3],#));
//获取html的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],./);
$txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid);
//输出
if( !empty($txtfile_id ) ) {
if($this->moudle == dresult) {
return "<a".$matches[1]."href=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/readfile/$txtfile_id?pid=".$this->projectid .$matches[2].$matches[4];
} else {
return "<a".$matches[1]."href=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/txtfile/$txtfile_id?pid=".$this->projectid .$matches[2].$matches[4];
}
} else {
return "<a".$matches[1]."href=".$matches[2].$matches[3].$matches[2].$matches[4];
}
}
private function iframe_replace( $matches ) {
if(count($matches) < 4) return ;
if( empty($matches[3]) ) return ;
$matches[3] = rtrim($matches[3],\"/);
//处理锚点
if(substr_count($matches[3],#)>0)
$matches[3] = substr($matches[3],0,strrpos($matches[3],#));
//获取html的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],./);
$txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid);
//输出
if( !empty($txtfile_id ) ) {
if($this->moudle == dresult) {
return "<iframe".$matches[1]."src=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/readfile/$txtfile_id?pid=".$this->projectid .$matches[2].$matches[4];
} else {
return "<iframe".$matches[1]."src=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/txtfile/$txtfile_id?pid=".$this->projectid .$matches[2].$matches[4];
}
} else {
return "<iframe".$matches[1]."src=".$matches[2].$matches[3].$matches[2].$matches[4];
}
}
private function frame_replace( $matches ) {
if(count($matches) < 4) return ;
if( empty($matches[3]) ) return ;
$matches[3] = rtrim($matches[3],\"/);
//处理锚点
if(substr_count($matches[3],#)>0)
$matches[3] = substr($matches[3],0,strrpos($matches[3],#));
//获取html的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],./);
$txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid);
//输出
if( !empty($txtfile_id ) ) {
if($this->moudle == dresult) {
return "<frame".$matches[1]."src=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/readfile/$txtfile_id?pid=".$this->projectid.$matches[2].$matches[4];
} else {
return "<frame".$matches[1]."src=".$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/txtfile/$txtfile_id?pid=".$this->projectid.$matches[2].$matches[4];
}
} else {
return "<frame".$matches[1]."src=".$matches[2].$matches[3].$matches[2].$matches[4];
}
}
private function js_replace( $matches ){
if(count($matches) < 4) return ;
if( empty($matches[3]) ) return ;
//处理链接
$arr_html = split(,,$matches[3]);
$href = $arr_html[0];
$other = ;
for($i=0; $i<count($arr_html); $i++)
$other = $arr_html[$i].", ";
$other = rtrim($other,"\, ");
$href =rtrim($href,\\");
//处理锚点
if(substr_count($href,#)>0)
return "window.open".$matches[1].$matches[2].$matches[3].$matches[4];;
//获取html的id
$parent_dir_num = substr_count( $href, ../);
$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($href,./);
$txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid);
//输出
if( !empty($txtfile_id ) ) {
if($this->moudle == dresult) {
return "window.open".$matches[1].$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/readfile/$txtfile_id?pid=".$this->projectid.$matches[2].,.$other.$matches[4];
} else {
return "window.open".$matches[1].$matches[2].$this->CI->config->item("base_url")."cdms/".$this->moudle."/txtfile/$txtfile_id?pid=".$this->projectid.$matches[2].,.$other.$matches[4];
}
} else {
return "window.open".$matches[1].$matches[2].$matches[3].$matches[4];
}
}
private function css_replace( $matches ) {
if(count($matches) < 5) return ;
if( empty($matches[4]) ) return ;
$matches[4] = rtrim($matches[4],\"/);
//获取图片的id
$parent_dir_num = substr_count( $matches[4], ../);
$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[4],./);
$image_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid);
//输出
if( !empty($image_id) ) {
if($this->moudle == dresult) {
return "background".$matches[1]."url".$matches[2].$matches[3].$this->CI->config->item("base_url")."cdms/".$this->moudle."/readpic/$image_id?pid=".$this->projectid .$matches[3]. $matches[5];
} else {
return "background".$matches[1]."url".$matches[2].$matches[3].$this->CI->config->item("base_url")."cdms/".$this->moudle."/picfile/$image_id?pid=".$this->projectid .$matches[3]. $matches[5];
}
} else {
return "background".$matches[1]."url".$matches[2].$matches[3].$matches[4].$matches[3].$matches[5];
}
}
}
/* End of Myreplace.php */
/* Location: /application/libraries/Myreplace.php */
希望本文所述对大家的php程序设计有所帮助 。 |