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

 更新时间:2015年06月17日 16:18:59   作者:邪恶的小Y  
这篇文章主要介绍了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 */

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript

正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg

希望本文所述对大家的php程序设计有所帮助。

相关文章

  • php下Memcached入门实例解析

    php下Memcached入门实例解析

    这篇文章主要介绍了php下Memcached入门实例,较为详细的分析了memcached的概念与用法,是非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • 通用PHP动态生成静态HTML网页的代码

    通用PHP动态生成静态HTML网页的代码

    最近研究PHP的一些开发技术,发现PHP有很多ASP所没有的优秀功能,可以完成一些以前无法完成的功能,例如动态生成HTML静态页面,以减少服务器CPU的负载,提高用户访问的速度。
    2010-03-03
  • Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解

    Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解

    大家都知道ffmpeg是一款视频流的软件了,我们在linux系统中可以安装ffmpeg了,这篇文章主要介绍了在Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤,需要的朋友可以参考下。
    2017-03-03
  • PHP设计模式之结构模式的深入解析

    PHP设计模式之结构模式的深入解析

    本篇文章是对PHP设计模式中的结构模式进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 使用PHPWord生成word文档的方法详解

    使用PHPWord生成word文档的方法详解

    这篇文章主要介绍了使用PHPWord生成word文档的方法,结合实例形式详细分析了PHPWord生成word文档的具体操作步骤与相关使用技巧,需要的朋友可以参考下
    2019-06-06
  • 解析PHP获取当前网址及域名的实现代码

    解析PHP获取当前网址及域名的实现代码

    本篇文章是对PHP获取当前网址及域名的代码进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP的SQL注入过程分析

    PHP的SQL注入过程分析

    今天从网上学习了有关SQL注入的基本技能,SQL注入的重点就是构造SQL语句,只有灵活的运用SQL语句才能构造出牛的注入字符串
    2012-01-01
  • PHP实现的DES加密解密类定义与用法示例

    PHP实现的DES加密解密类定义与用法示例

    这篇文章主要介绍了PHP实现的DES加密解密类定义与用法,结合实例形式分析了基于php定义的DES加密解密类与具体使用方法,需要的朋友可以参考下
    2018-07-07
  • PHP中危险的file_put_contents函数详解

    PHP中危险的file_put_contents函数详解

    file_put_contents() 函数把一个字符串写入文件中。最近发现file_put_contents函数有一直没注意到的问题,所以下面这篇文章主要给大家介绍了关于PHP中危险的file_put_contents函数的相关资料,需要的朋友可以参考借鉴,下面来一起看吧。
    2017-11-11
  • php读取mysql乱码,用set names XXX解决的原理分享

    php读取mysql乱码,用set names XXX解决的原理分享

    解决乱码的方法,我们经常使用“set names utf8”,那么为什么加上这句代码就可以解决了呢?下面跟着我一起来深入set names utf8的内部执行原理
    2011-12-12

最新评论