<p><!--?php <br /-->/********************************************************************<br />
* 流程说明:<br />
* 当附合要求的参数传递进filter函数后,filter()函数首先<br />
* 把要字串中所有要过滤的标签$tag通过preg_match_all()<br />
* 取出来,然后循环preg_match_all的匹配数组,通过preg_split()<br />
* 函数分割每个标签为 "左边属性" = "右边值"的形式,再从要保<br />
* 留的属性数组中循环,将preg_split()匹配的内容对应取出,构成<br />
* 可以替换的值,后最通过str_replcae()替换掉字串中相应的标签<br />
* 函数列表:<br />
* function filter(&$str,$tag,$keep_attribute)<br />
* function match($reg,&$str,$arr)<br />
* function show($str,$title="',$debug = True)<br />
* 使用示例:<br />
* //取得搜狐新闻首页<br />
* $str = @file_get_content("http://news.sohu.com");<br />
* //过滤<br />
* filter($str,"a','href,target,alt');<br />
* filter($str,'p','align');<br />
* show($str,'过滤后的内容');<br />
********************************************************************/<br />
$start_time = array_sum(explode(" ",microtime()));<br />
$str = <<< HTML<br />
<a alt="a a a" href="http://www.cit.cn" target="_blank" xxx="xadsfa">site a</a><br />
<a alt="b b b" href="http://www.b.com" target="_blank" xxx="xadsfa">site b</a><br />
<a alt="c" c="" href="http://www.cit.net" target="_blank" xxx="xadsfa">site c</a><br />
<a alt="d" d="" href="http://www.d.com" target="_blank" xxx="xadsfa">site d</a><br />
<a alt="e" e="" href="http://www.e.com" target="_blank" xxx="xadsfa">site e</a></p>
<p align="right" >adasdfasdf</p>
<p></p>
<p align="left" >asdfasdfasdfasdf</p>
<p></p>
<p align="left" center="" right="">asdfasdfasdf</p>
<p><br />
<font adsasd="" alt="adasd" color="red">asdfadsfasdf</font><br />
<font align="left" color="red">asdfasdfadf</font><br />
<font align="left" black="" color="red" right="">asdfasdf</font><br />
HTML;<br />
//显示原字串<br />
show($str,'Html');<br />
/***********************************************************************************************************************************************************************/<br />
//过滤<br />
filter($str,'a','href,target,alt');<br />
filter($str,'p','align');<br />
filter($str,'font','color,alt');<br />
//显示过滤后的内容<br />
show($str,'Result');<br />
//脚本运行时间<br />
$run_time = array_sum(explode(" ",microtime())) - $start_time;<br />
echo('</p>
<center>Script Run Time: '.$run_time.'</center>
<p>');<br />
<br />
/**<br />
* 说明:过滤HTML字串<br />
* 参数:<br />
* $str : 要过滤的HTML字串<br />
* $tag : 过滤的标签类型<br />
* $keep_attribute :<br />
* 要保留的属性,此参数形式可为<br />
* href<br />
* href,target,alt<br />
* array('href','target','alt')<br />
*/<br />
function filter(&$str,$tag,$keep_attribute) {<br />
//检查要保留的属性的参数传递方式<br />
if(!is_array($keep_attribute)) {<br />
//没有传递数组进来时判断参数是否包含,号<br />
if(strpos($keep_attribute,',')) {<br />
//包含,号时,切分参数串为数组<br />
$keep_attribute = explode(',',$keep_attribute);<br />
}else {<br />
//纯字串,构造数组<br />
$keep_attribute = array($keep_attribute);<br />
}<br />
}<br />
echo("·过滤[$tag]标签,保留属性:".implode(',',$keep_attribute).'<br />
');<br />
//取得所有要处理的标记<br />
$pattern = "/<$tag(.*)<!--$tag-->/i";<br />
preg_match_all($pattern,$str,$out);<br />
//循环处理每个标记<br />
foreach($out[1] as $key => $val) {<br />
//取得a标记中有几个=<br />
$cnt = preg_split('/ *=/i',$val);<br />
$cnt = count($cnt) -1;<br />
//构造匹配正则<br />
$pattern = '';<br />
for($i=1; $i<=$cnt; $i++) {<br />
$pattern .= '( .*=.*)';<br />
}<br />
//完成正则表达式形成,如/(<a)(>.*/i的样式<br />
$pattern = "/(<$tag)$pattern(>.*<!--$tag-->)/i";<br />
//取得保留属性<br />
$replacement = match($pattern,$out[0][$key],$keep_attribute);<br />
//替换<br />
$str = str_replace($out[0][$key],$replacement,$str);<br />
}<br />
}</a)(></p>
<p></p>
<p>/**<br />
* 说明:构造标签,保留要保留的属性<br />
* 参数:$reg : pattern,preg_match的表达式<br />
* $str : string,html字串<br />
* $arr : array,要保留的属性<br />
* 返回:<br />
* 返回经保留处理后的标签,如<br />
* <a alt="e" e="" href="http://www.e.com" target="_blank">e.com</a><br />
*/<br />
function match($reg,&$str,$arr) {<br />
//match<br />
preg_match($reg,$str,$out);<br />
//取出保留的属性<br />
$keep_attribute = '';<br />
foreach($arr as $k1=>$v1) {<br />
//定义的要保留的属性的数组<br />
foreach($out as $k2=>$v2) {<br />
//匹配=后的数组<br />
$attribute = trim(substr($v2,0,strpos($v2,'=')));<br />
//=前面的<br />
if($v1 == $attribute) {<br />
//要保留的属性和匹配的值的=前的部分相同<br />
$keep_attribute .= $v2;<br />
//保存此匹配部分的值<br />
}<br />
}<br />
}<br />
//构造返回值,结构如:<a class="xxx" href="xxx" target="xxx">aadd</a><br />
$keep_attribute = $out[1].$keep_attribute.($out[count($out)-1]);<br />
//返回值<br />
Return $keep_attribute;<br />
}<br />
<br />
/**<br />
* 显示字串内容<br />
*/<br />
function show($str,$title="',$debug = True) {<br />
if($debug) {<br />
if(is_array($str)) {<br />
$str = print_r($str,True);<br />
}<br />
$txtRows = count(explode("n",$str))+1;<br />
echo($title.":<br />
<textarea cols="130" name="txt" rows="'.$txtRows.'">'.$str.'</textarea><br />
<br />
');<br />
}<br />
}<br />
?></p>
<p></p>