我正在使用这两个函数来提取html标签的属性,但它没有像我想的那样工作。 我想要的是他们应该提取属性并用SANITIZED
替换它或
他们完全删除标签中的所有给定属性。
public function sanitizeHTML($inputHTML, $allowed_tags = array('<h2>', '<h3>', '<p>', '<br>', '<b>', '<i>', '<a>', '<ul>', '<li>', '<blockquote>', '<span>', '<code>', '<img>')) {
$_allowed_tags = implode('', $allowed_tags);
$inputHTML = strip_tags($inputHTML, $_allowed_tags);
return preg_replace('/#<(.*?)>#ise/', "'<' . $this->removeBadAttributes('\\1') . '>'", $inputHTML);
}
public function removeBadAttributes($inputHTML) {
$bad_attributes = 'onclick|ondblclick|onblur|onfocus|onerror|'.'mouseleave|mouseenter|onmousedown|onmouseup|onmousemove|onmouseout|onmouseover|' . 'onkeypress|onkeydown|onkeyup|javascript:';
return stripslashes(preg_replace("/#($bad_attributes)(\s*)(?==)#ise/",'SANITIZED', $inputHTML));
}
请详细解答我。我对reg exp
了解不多答案 0 :(得分:0)
你的正则表达式似乎有错误的味道,或者根本没有效果。另外,请尝试不要使用e
修饰符,如@ThiefMaster所说。
固定代码是:
public function sanitizeHTML($inputHTML, $allowed_tags = array('<h2>', '<h3>', '<p>', '<br>', '<b>', '<i>', '<a>', '<ul>', '<li>', '<blockquote>', '<span>', '<code>', '<img>')) {
$_allowed_tags = implode('', $allowed_tags);
$inputHTML = strip_tags($inputHTML, $_allowed_tags);
preg_match_all('/<(.*?)>/is', $inputHTML, $tags);
foreach($tags[1] as $i => $tag ){
$sanitized_tags[$i] = $this->removeBadAttributes($tag);
}
return str_replace($tags[1], $sanitized_tags, $inputHTML);
}
public function removeBadAttributes($inputHTML) {
$bad_attributes = 'onclick|ondblclick|onblur|onfocus|onerror|'.'mouseleave|mouseenter|onmousedown|onmouseup|onmousemove|onmouseout|onmouseover|' . 'onkeypress|onkeydown|onkeyup|javascript:';
return stripslashes(preg_replace("/($bad_attributes)=\"(.*?)\"/is","", $inputHTML));
}
测试:
$html ='
<div id="teste"></div>
<p>
<ul>
<li onclick="fool()" onblur="fool()" class="some-class"></li>
<li onblur="fool()"></li>
<li onclick="fool()"></li>
<li></li>
</ul>
</p>';
echo $sanitize->sanitizeHTML($html);
输出:
<p>
<ul>
<li class="some-class"></li>
<li></li>
<li></li>
<li></li>
</ul>
</p>
很难记住,对于这种情况肯定有更好的解决方案 喜欢使用流行的PHP中已经测试过的sanitize类 CodeIgniter,CakePHP,Zend等框架。
希望它有所帮助。