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


Posted in PHP onJune 17, 2015

本文实例讲述了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 相关文章推荐
PHP.MVC的模板标签系统(四)
Sep 05 PHP
自定义PHP分页函数
Oct 09 PHP
很好用的PHP数据库类
May 27 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
Sep 25 PHP
使用php判断服务器是否支持Gzip压缩功能
Sep 24 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
php 使用array函数实现分页
Feb 13 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
开启PHP的伪静态模式
Dec 31 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
PHP排序算法类实例
Jun 17 #PHP
php准确获取文件MIME类型的方法
Jun 17 #PHP
php操作MongoDB类实例
Jun 17 #PHP
PHP实现的购物车类实例
Jun 17 #PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 #PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 #PHP
php使用curl打开https网站的方法
Jun 17 #PHP
You might like
php使用ICQ网关发送手机短信
2013/10/30 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
网上抓的一个特效
2007/05/11 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
线程和进程的区别及Python代码实例
2015/02/04 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
pytorch数据预处理错误的解决
2020/02/20 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
365 Tickets英国:全球景点门票
2019/07/06 全球购物
英国鞋网:Rubber Sole
2020/03/03 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
工程班组长岗位职责
2013/12/30 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
产品质量承诺书
2014/03/27 职场文书
施工安全承诺书
2014/05/22 职场文书
质量保证书格式模板
2015/02/27 职场文书
中标通知书格式
2015/04/17 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
详解Redis瘦身指南
2021/05/26 Redis