php正則替換處理HTML頁面的方法_php技巧

來源:互聯網
上載者:User

本文執行個體講述了php正則替換處理HTML頁面的方法。分享給大家供大家參考。具體如下:

<?phpif(!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款非常方便的Regex工具供大家參考使用:

JavaScriptRegex線上測試載入器:
http://tools.jb51.net/regex/javascript

Regex線上產生工具:
http://tools.jb51.net/regex/create_reg

希望本文所述對大家的php程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.