preg_replace无法找到并替换字符串

时间:2012-01-14 12:26:57

标签: php preg-replace

我正在使用这两个函数来提取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

了解不多

1 个答案:

答案 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等框架。

希望它有所帮助。