首页 > 网站 > 建站经验 > 正文

php正则替换处理HTML页面的方法

2024-04-25 20:37:29
字体:
来源:转载
供稿:网友

本文实例讲述了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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表