湖中沉 发表于 2012-12-16 17:09:39

Php 过滤html标签,只保留指定属性

function parse($m){return call_user_func("parse{$m}",$m);}

function parsea($str,$attr=array('href')){return '<a '.parseattr($str,$attr).'>';}

function parsep($str,$attr=array('align','id')){return '<p '.parseattr($str,$attr).'>';}

function parseattr($str,$attr=array()){if(empty($attr))return '';$attrs=explode(' ', $str);foreach ($attrs as $k=>$v){    foreach ($attr as $a)    {      if(strtolower(substr($v, 0,strlen($a)).'=')===strtolower($a.'='))      {      continue 2;      }    }    unset($attrs[$k]);}return implode(' ', $attrs);}

function myreplace($str){$reg='/<(p|a)(\s+)(.*?[^>])>/is';
return (preg_replace_callback($reg,'parse',$str));}

$str='<p align="center" class="asd" id="qwe">adf<a href="#" class="asd" id="qwe" align="center">123</a><div id="iii" style="color:red">4<p id="ww">5</p>6</div></p>';

echo myreplace(strip_tags($str,'<p><a>'));

//<p align="center" id="qwe">adf<a href="#">123</a>4<p id="ww">5</p>6</p>


重构版:Only for php5.3

function parseattr($str,$tag,$attr=array())
{
if(empty($attr))return '';
$attrs=explode(' ', $str);
foreach ($attrs as $k=>$v)
{
foreach ($attr as $a)
{
if(strtolower(substr($v, 0,strlen($a)).'=')==strtolower($a.'='))
{
continue 2;
}
}
unset($attrs[$k]);
}
return '< '.$tag.' '.implode(' ', $attrs).'>';
}
function myreplace($str,$tag,$attr=array())
{
$reg='/< '.$tag.'(\s+)(.*?[^>])>/is';
return (preg_replace_callback($reg,function ($v) use ($attr,$tag){return parseattr($v,$tag,$attr);},$str));
}

$str='<p align="center" class="asd" id="qwe">adf<a href="#" class="asd" id="qwe" align="center" rel="nofollow">123<div id="iii" style="color:red">4<p id="ww">56';

$str=strip_tags($str,'<p><a>');
$str=myreplace($str,'a',array('href'));
$str=myreplace($str,'p',array('align','id'));
echo $str;
页: [1]
查看完整版本: Php 过滤html标签,只保留指定属性