程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP常用函數:過濾HTML字符串

PHP常用函數:過濾HTML字符串

編輯:關於PHP編程

<?php
/********************************************************************
* 流程說明:
* 當附合要求的參數傳遞進filter函數後,filter()函數首先
* 把要字串中所有要過濾的標簽$tag通過preg_match_all()
* 取出來,然後循環preg_match_all的匹配數組,通過preg_split()
* 函數分割每個標簽為 "左邊屬性" = "右邊值"的形式,再從要保
* 留的屬性數組中循環,將preg_split()匹配的內容對應取出,構成
* 可以替換的值,後最通過str_replcae()替換掉字串中相應的標簽
* 函數列表:
* function filter(&$str,$tag,$keep_attribute)
* function match($reg,&$str,$arr)
* function show($str,$title=,$debug = True)
* 使用示例:
* //取得搜狐新聞首頁
* $str = @file_get_content("http://news.sohu.com");
* //過濾
* filter($str,a,href,target,alt);
* filter($str,p,align);
* show($str,過濾後的內容);
********************************************************************/

$start_time = array_sum(explode(" ",microtime()));

$str = <<< HTML
<A style="a" target=_blank href=http://www.BkJia.com xxx=xadsfa alt="a a a" style="aa">site a</A>
<A alt=b b b xxx=xadsfa target=_blank href=http://www.b.com style="b" style="bb">site b</A>
<A xxx=xadsfa style="c" href=http://www.php100.net target=_blank alt=c c c style="cc">site c</A>
<A style="d" href=http://www.d.com xxx=xadsfa alt=d d d target=_blank style="dd">site d</A>
<A target=_blank style="e" xxx=xadsfa style="ee" alt=e e e href=http://www.e.com>site e</A>

<p align=right style="font-size:10px">adasdfasdf</p>
<p style="font-color:red;" align=left>asdfasdfasdfasdf</p>
<p align=left right center>asdfasdfasdf</p>

<font color="red" alt=adasd adsasd>asdfadsfasdf</font>
<font align=left color=red>asdfasdfadf</font>
<font align=left right color=red black>asdfasdf</font>
HTML;

//顯示原字串
show($str,Html);

/***********************************************************************************************************************************************************************/
//過濾
filter($str,a,href,target,alt);
filter($str,p,align);
filter($str,font,color,alt);

//顯示過濾後的內容
show($str,Result);

//腳本運行時間
$run_time = array_sum(explode(" ",microtime())) - $start_time;
echo(<center>Script Run Time: .$run_time.</center>);

 

/**
* 說明:過濾HTML字串
* 參數:
* $str : 要過濾的HTML字串
* $tag : 過濾的標簽類型
* $keep_attribute :
* 要保留的屬性,此參數形式可為
* href
* href,target,alt
* array(href,target,alt)
*/
function filter(&$str,$tag,$keep_attribute) {

//檢查要保留的屬性的參數傳遞方式
if(!is_array($keep_attribute)) {
//沒有傳遞數組進來時判斷參數是否包含,號
if(strpos($keep_attribute,,)) {
//包含,號時,切分參數串為數組
$keep_attribute = explode(,,$keep_attribute);
}else {
//純字串,構造數組
$keep_attribute = array($keep_attribute);
}
}

echo("·過濾[$tag]標簽,保留屬性:".implode(,,$keep_attribute).<br>);

//取得所有要處理的標記
$pattern = "/<$tag(.*)</$tag>/i";
preg_match_all($pattern,$str,$out);

//循環處理每個標記
foreach($out[1] as $key => $val) {
//取得a標記中有幾個=
$cnt = preg_split(/ *=/i,$val);
$cnt = count($cnt) -1;

//構造匹配正則
$pattern = ;
for($i=1; $i<=$cnt; $i++) {

$pattern .= ( .*=.*);
}
//完成正則表達式形成,如/(<a)( .*=.*)( .*=.*)(>.*</a>/i的樣式
$pattern = "/(<$tag)$pattern(>.*</$tag>)/i";

//取得保留屬性
$replacement = match($pattern,$out[0][$key],$keep_attribute);

//替換
$str = str_replace($out[0][$key],$replacement,$str);
}
}


/**
* 說明:構造標簽,保留要保留的屬性
* 參數:$reg : pattern,preg_match的表達式
* $str : string,html字串
* $arr : array,要保留的屬性
* 返回:
* 返回經保留處理後的標簽,如
* <A href=http://www.e.com target=_blank alt=e e e>e.com</A>
*/
function match($reg,&$str,$arr) {

//match
preg_match($reg,$str,$out);

//取出保留的屬性
$keep_attribute = ;
foreach($arr as $k1=>$v1) {
//定義的要保留的屬性的數組
foreach($out as $k2=>$v2) {
//匹配=後的數組
$attribute = trim(substr($v2,0,strpos($v2,=)));
//=前面的
if($v1 == $attribute) {
//要保留的屬性和匹配的值的=前的部分相同
$keep_attribute .= $v2;
//保存此匹配部分的值
}
}

}

//構造返回值,結構如:<a href=xxx target=xxx class=xxx>aadd</a>
$keep_attribute = $out[1].$keep_attribute.($out[count($out)-1]);
//返回值
Return $keep_attribute;
}

 

/**
* 顯示字串內容
*/
function show($str,$title=,$debug = True) {

if($debug) {
if(is_array($str)) {
$str = print_r($str,True);
}
$txtRows = count(explode(" ",$str))+1;
echo($title.:<br><TEXTAREA NAME="txt" ROWS=".$txtRows." COLS="130">.$str.</TEXTAREA><br><br>);
}

}

?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved