PHP常用函数:过滤HTML字符串

<p><!--?php <br /-->/********************************************************************<br /> * 流程说明:<br /> * 当附合要求的参数传递进filter函数后,filter()函数首先<br /> * 把要字串中所有要过滤的标签$tag通过preg_match_all()<br /> * 取出来,然后循环preg_match_all的匹配数组,通过preg_split()<br /> * 函数分割每个标签为 &quot;左边属性&quot; = &quot;右边值&quot;的形式,再从要保<br /> * 留的属性数组中循环,将preg_split()匹配的内容对应取出,构成<br /> * 可以替换的值,后最通过str_replcae()替换掉字串中相应的标签<br /> * 函数列表:<br /> * function filter(&amp;$str,$tag,$keep_attribute)<br /> * function match($reg,&amp;$str,$arr)<br /> * function show($str,$title=&quot;&#39;,$debug = True)<br /> * 使用示例:<br /> * //取得搜狐新闻首页<br /> * $str = @file_get_content(&quot;http://news.sohu.com&quot;);<br /> * //过滤<br /> * filter($str,&quot;a&#39;,&#39;href,target,alt&#39;);<br /> * filter($str,&#39;p&#39;,&#39;align&#39;);<br /> * show($str,&#39;过滤后的内容&#39;);<br /> ********************************************************************/<br /> $start_time = array_sum(explode(&quot; &quot;,microtime()));<br /> $str = &lt;&lt;&lt; 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,&#39;Html&#39;);<br /> /***********************************************************************************************************************************************************************/<br /> //过滤<br /> filter($str,&#39;a&#39;,&#39;href,target,alt&#39;);<br /> filter($str,&#39;p&#39;,&#39;align&#39;);<br /> filter($str,&#39;font&#39;,&#39;color,alt&#39;);<br /> //显示过滤后的内容<br /> show($str,&#39;Result&#39;);<br /> //脚本运行时间<br /> $run_time = array_sum(explode(&quot; &quot;,microtime())) - $start_time;<br /> echo(&#39;</p> <center>Script Run Time: &#39;.$run_time.&#39;</center> <p>&#39;);<br /> <br /> /**<br /> * 说明:过滤HTML字串<br /> * 参数:<br /> * $str : 要过滤的HTML字串<br /> * $tag : 过滤的标签类型<br /> * $keep_attribute :<br /> * 要保留的属性,此参数形式可为<br /> * href<br /> * href,target,alt<br /> * array(&#39;href&#39;,&#39;target&#39;,&#39;alt&#39;)<br /> */<br /> function filter(&amp;$str,$tag,$keep_attribute) {<br /> //检查要保留的属性的参数传递方式<br /> if(!is_array($keep_attribute)) {<br /> //没有传递数组进来时判断参数是否包含,号<br /> if(strpos($keep_attribute,&#39;,&#39;)) {<br /> //包含,号时,切分参数串为数组<br /> $keep_attribute = explode(&#39;,&#39;,$keep_attribute);<br /> }else {<br /> //纯字串,构造数组<br /> $keep_attribute = array($keep_attribute);<br /> }<br /> }<br /> echo(&quot;&middot;过滤[$tag]标签,保留属性:&quot;.implode(&#39;,&#39;,$keep_attribute).&#39;<br /> &#39;);<br /> //取得所有要处理的标记<br /> $pattern = &quot;/&lt;$tag(.*)<!--$tag-->/i&quot;;<br /> preg_match_all($pattern,$str,$out);<br /> //循环处理每个标记<br /> foreach($out[1] as $key =&gt; $val) {<br /> //取得a标记中有几个=<br /> $cnt = preg_split(&#39;/ *=/i&#39;,$val);<br /> $cnt = count($cnt) -1;<br /> //构造匹配正则<br /> $pattern = &#39;&#39;;<br /> for($i=1; $i&lt;=$cnt; $i++) {<br /> $pattern .= &#39;( .*=.*)&#39;;<br /> }<br /> //完成正则表达式形成,如/(<a)(>.*/i的样式<br /> $pattern = &quot;/(&lt;$tag)$pattern(&gt;.*<!--$tag-->)/i&quot;;<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,&amp;$str,$arr) {<br /> //match<br /> preg_match($reg,$str,$out);<br /> //取出保留的属性<br /> $keep_attribute = &#39;&#39;;<br /> foreach($arr as $k1=&gt;$v1) {<br /> //定义的要保留的属性的数组<br /> foreach($out as $k2=&gt;$v2) {<br /> //匹配=后的数组<br /> $attribute = trim(substr($v2,0,strpos($v2,&#39;=&#39;)));<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=&quot;&#39;,$debug = True) {<br /> if($debug) {<br /> if(is_array($str)) {<br /> $str = print_r($str,True);<br /> }<br /> $txtRows = count(explode(&quot;n&quot;,$str))+1;<br /> echo($title.&quot;:<br /> <textarea cols="130" name="txt" rows="'.$txtRows.'">&#39;.$str.&#39;</textarea><br /> <br /> &#39;);<br /> }<br /> }<br /> ?&gt;</p> <p></p>
RangeTime:0.007743s
RangeMem:211.55 KB
返回顶部 留言