首页 > 开发 > PHP > 正文

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

2024-05-04 23:36:21
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php正则替换处理HTML页面的方法,涉及php针对html页面常见元素的匹配技巧,需要的朋友可以参考下

本文实例讲述了php正则替换处理HTML页面的方法。分享给大家供大家参考。具体如下:

 

 
  1. <?php 
  2. if(!defined('BASEPATH')) exit('No direct script access allowed'); 
  3. /** 
  4. * HTML替换处理类,考虑如下几种替换 
  5. * 1. img src : '/<img(.+?)src=([/'/" ])?(.+?)([ >]+?)/i' 
  6. * 2. a href : '/<a(.+?)href=([/'/" ])?(.+?)([ >]+?)/i' 
  7. * 3. ifram.src : '/<iframe(.+?)src=([/'/" ])?(.+?)([ >]+?)/i' 
  8. * 4. frame src : '/<frame(.+?)src=([/'/" ])?(.+?)([ >]+?)/i' 
  9. * 5. js : '/window.open([( ]+?)([/'" ]+?)(.+?)([ )+?])/i' 
  10. * 6. css : '/background(.+?)url([( ])([/'" ]+?)(.+?)([ )+?])/i' 
  11. */ 
  12. class Myreplace { 
  13. private $moudle_array = array('udata','tdata','tresult','dresult'); 
  14. private $content
  15. private $relative_dirname
  16. private $projectid
  17. private $moudle
  18. function __construct() { 
  19. $this->CI = &get_instance (); 
  20. /** 
  21. * 替换 
  22. * @param string $content HTML内容 
  23. * @param string $relative 相对路径 
  24. * @param int $projectid 项目id 
  25. * @moudle string $moudle 模板标识: udata,tdata,tresult,dresult 
  26. */ 
  27. public function my_replace($content,$relative,$projectid,$moudle) { 
  28. $this->content = $content
  29. $this->relative_dirname = $relative
  30. $this->projectid = $projectid
  31. if(in_array(strtolower($moudle),$this->moudle_array)) 
  32. $this->moudle = $moudle
  33. else exit
  34. switch($this->moudle) { 
  35. case 'udata'
  36. $this->CI->load->model('mupload_data','model'); 
  37. break
  38. case 'tdata'
  39. $this->CI->load->model('taskdata','model'); 
  40. break
  41. case 'tresult'
  42. $this->CI->load->model('taskresult','model'); 
  43. break
  44. case 'dresult'
  45. $this->CI->load->model('dmsresult','model'); 
  46. break
  47. default
  48. break
  49. $pattern = '/<img(.+?)src=([/'/" ])?(.+?)([ >]+?)/i'
  50. $content = preg_replace_callback( $patternarray($this'image_replace') , $content ); 
  51. $pattern = '/<a(.+?)href=([/'/" ])?(.+?)([ >]+?)/i'
  52. $content = preg_replace_callback( $patternarray($this'html_replace') , $content ); 
  53. $pattern = '/<iframe(.+?)src=([/'/" ])?(.+?)([ >]+?)/i'
  54. $content = preg_replace_callback( $patternarray($this'iframe_replace') , $content ); 
  55. $pattern = '/<frame(.+?)src=([/'/" ])?(.+?)([ >]+?)/i';  
  56. $content = preg_replace_callback( $patternarray($this'frame_replace'), $content ); 
  57. $pattern = '/window.open([( ]+?)([/'" ]+?)(.+?)([ )]+?)/i'
  58. $content = preg_replace_callback( $patternarray($this'js_replace'), $content ); 
  59. $pattern = '/background(.+?)url([( ])([/'" ]+?)(.+?)([ )+?])/i'
  60. $content = preg_replace_callback( $patternarray($this'css_replace'), $content); 
  61. return $content
  62. private function image_replace($matches) { 
  63. if(count($matches) < 4) return ''
  64. ifemptyempty($matches[3]) ) return ''
  65. $matches[3] = rtrim($matches[3],'/'"/'); 
  66. //获取图片的id 
  67. $parent_dir_num = substr_count( $matches[3], '../'); 
  68. $relative_dirname = $this->relative_dirname; 
  69. for($i=0; $i<$parent_dir_num$i++) { 
  70. $relative_dirname = substr$relative_dirname, 0, strrpos($relative_dirname,"/") ); 
  71. $relativepath = rtrim($relative_dirname,'/') . '/'.ltrim($matches[3],'./'); 
  72. $image_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid); 
  73. //输出 
  74. if( !emptyempty($image_id) ) { 
  75. if($this->moudle == 'dresult') { 
  76. 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]; 
  77. else { 
  78. 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]; 
  79. else { 
  80. return "<img".$matches[1]."src=".$matches[2].$matches[3].$matches[2].$matches[4]; 
  81. private function html_replace( $matches ) { 
  82. if(count($matches) < 4) return ''
  83. ifemptyempty($matches[3]) ) return ''
  84. //如果href的链接($matches[3])以http或www或mailto开始,则不进行处理 
  85. //if(preg_match('/^[http|www|mailto](.+?)/i',$matches[3]))  
  86. // return "<a".$matches[1]."href=".$matches[2].$matches[3].$matches[4]; 
  87. $matches[3] = rtrim($matches[3],'/'"/'); 
  88. //处理锚点 
  89. if(substr_count($matches[3],'#')>0)  
  90. $matches[3] = substr($matches[3],0,strrpos($matches[3],'#')); 
  91. //获取html的id 
  92. $parent_dir_num = substr_count( $matches[3], '../'); 
  93. $relative_dirname = $this->relative_dirname; 
  94. for($i=0; $i<$parent_dir_num$i++) { 
  95. $relative_dirname = substr$relative_dirname, 0, strrpos($relative_dirname,"/") ); 
  96. $relativepath = rtrim($relative_dirname,'/') . '/'.ltrim($matches[3],'./'); 
  97. $txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid); 
  98. //输出 
  99. if( !emptyempty($txtfile_id ) ) { 
  100. if($this->moudle == 'dresult') { 
  101. 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]; 
  102. else { 
  103. 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]; 
  104. else { 
  105. return "<a".$matches[1]."href=".$matches[2].$matches[3].$matches[2].$matches[4]; 
  106. private function iframe_replace( $matches ) { 
  107. if(count($matches) < 4) return ''
  108. ifemptyempty($matches[3]) ) return ''
  109. $matches[3] = rtrim($matches[3],'/'"/'); 
  110. //处理锚点 
  111. if(substr_count($matches[3],'#')>0)  
  112. $matches[3] = substr($matches[3],0,strrpos($matches[3],'#')); 
  113. //获取html的id 
  114. $parent_dir_num = substr_count( $matches[3], '../'); 
  115. $relative_dirname = $this->relative_dirname; 
  116. for($i=0; $i<$parent_dir_num$i++) { 
  117. $relative_dirname = substr$relative_dirname, 0, strrpos($relative_dirname,"/") ); 
  118. $relativepath = rtrim($relative_dirname,'/') . '/'.ltrim($matches[3],'./'); 
  119. $txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid); 
  120. //输出 
  121. if( !emptyempty($txtfile_id ) ) { 
  122. if($this->moudle == 'dresult') {  
  123. 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]; 
  124. else { 
  125. 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]; 
  126. else { 
  127. return "<iframe".$matches[1]."src=".$matches[2].$matches[3].$matches[2].$matches[4]; 
  128. private function frame_replace( $matches ) {  
  129. if(count($matches) < 4) return ''
  130. ifemptyempty($matches[3]) ) return ''
  131. $matches[3] = rtrim($matches[3],'/'"/'); 
  132. //处理锚点 
  133. if(substr_count($matches[3],'#')>0)  
  134. $matches[3] = substr($matches[3],0,strrpos($matches[3],'#')); 
  135. //获取html的id 
  136. $parent_dir_num = substr_count( $matches[3], '../'); 
  137. $relative_dirname = $this->relative_dirname; 
  138. for($i=0; $i<$parent_dir_num$i++) { 
  139. $relative_dirname = substr$relative_dirname, 0, strrpos($relative_dirname,"/") ); 
  140. $relativepath = rtrim($relative_dirname,'/') . '/'.ltrim($matches[3],'./'); 
  141. $txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid); 
  142. //输出 
  143. if( !emptyempty($txtfile_id ) ) { 
  144. if($this->moudle == 'dresult') {  
  145. 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]; 
  146. else { 
  147. 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]; 
  148. else { 
  149. return "<frame".$matches[1]."src=".$matches[2].$matches[3].$matches[2].$matches[4]; 
  150. private function js_replace( $matches ){ 
  151. if(count($matches) < 4) return ''
  152. ifemptyempty($matches[3]) ) return ''
  153. //处理链接 
  154. $arr_html = split(',',$matches[3]); 
  155. $href = $arr_html[0]; 
  156. $other = ''
  157. for($i=0; $i<count($arr_html); $i++) 
  158. $other = $arr_html[$i].", "
  159. $other = rtrim($other,"/, "); 
  160. $href =rtrim($href,'/'/"'); 
  161. //处理锚点 
  162. if(substr_count($href,'#')>0)  
  163. return "window.open".$matches[1].$matches[2].$matches[3].$matches[4];; 
  164. //获取html的id 
  165. $parent_dir_num = substr_count( $href'../'); 
  166. $relative_dirname = $this->relative_dirname; 
  167. for($i=0; $i<$parent_dir_num$i++) { 
  168. $relative_dirname = substr$relative_dirname, 0, strrpos($relative_dirname,"/") ); 
  169. $relativepath = rtrim($relative_dirname,'/') . '/'.ltrim($href,'./'); 
  170. $txtfile_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid); 
  171. //输出 
  172. if( !emptyempty($txtfile_id ) ) { 
  173. if($this->moudle == 'dresult') {  
  174. 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]; 
  175. else { 
  176. 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]; 
  177. else { 
  178. return "window.open".$matches[1].$matches[2].$matches[3].$matches[4]; 
  179. private function css_replace( $matches ) { 
  180. if(count($matches) < 5) return ''
  181. ifemptyempty($matches[4]) ) return ''
  182.  
  183. $matches[4] = rtrim($matches[4],'/'"/'); 
  184. //获取图片的id 
  185. $parent_dir_num = substr_count( $matches[4], '../'); 
  186. $relative_dirname = $this->relative_dirname; 
  187. for($i=0; $i<$parent_dir_num$i++) { 
  188. $relative_dirname = substr$relative_dirname, 0, strrpos($relative_dirname,"/") ); 
  189. $relativepath = rtrim($relative_dirname,'/') . '/'.ltrim($matches[4],'./'); 
  190. $image_id = $this->CI->model->get_id_by_path_and_project($relativepath,$this->projectid); 
  191. //输出 
  192. if( !emptyempty($image_id) ) { 
  193. if($this->moudle == 'dresult') { 
  194. 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]; 
  195. else { 
  196. 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]; 
  197. else { 
  198. return "background".$matches[1]."url".$matches[2].$matches[3].$matches[4].$matches[3].$matches[5]; 
  199. /* End of Myreplace.php */ 
  200. /* Location: /application/libraries/Myreplace.php */ 

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

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