8
回答
求一个PHP正则表达式把html中的所有标签属性全部去掉
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

一、用CMS系统的时候,直接粘贴文章会带有很多没有的垃圾标签或者属性,所以我需要把html中的所有标签属性全部去掉,除了img标签的alt和src属性保留。

自己写了个,感觉不到位:

//这个地方不知道怎么写,过滤所有标签的属性,除img的src和alt
$html=preg_replace("/<([a-zA-Z]+)[^>]*>/","<\\1>",$html);

这个会把全部的都换掉,但是img的我不能按照我想要的那样,求大神。


二、然后还有个就是table标签,比如:

<table......属性一大堆>
	<tr...属性一大堆><td>1.</td><td><span>随便一些字</span></td></td>
	<tr...属性一大堆><td>2.</td><td><span>随便一些字</span></td></td>
</table>

我想整理后得到这样:

<p>
1.<span>随便一些字</span>
2.<span>随便一些字</span>
</p>
举报
旋转360
发帖于2年前 8回/4K+阅
共有8个答案 最后回答: 1年前
为什么要用正则 PHP 有过滤方法呀 内置的
--- 共有 3 条评论 ---
旋转360明白了,这个函数还有第二个参数 2年前 回复
旋转360strip_tags这个方法是可以,但会全部干掉,但是我要保留img标签怎么破,还有a标签的title属性之类的 2年前 回复
旋转360哦?php内置的什么方法,还这不知道 2年前 回复

引用来自“Liuxd”的评论

https://github.com/liuxd/CodeSnippets/blob/master/PHP/XssFilter.php

试试这个。

<?php
/**
 * Prevent XSS.
 * Allowing you to add permmited tags or attributes.
 *
 * @author liuxd
 */
//error_reporting(E_ALL && ~E_NOTICE);
class XssFilter
{
    /**
     * Set white list.
     * @param array $p_aTags The tags you need.
     * @param array $p_aAttr The attributes you need.
     */
    public function __construct($p_aTags, $p_aAttr)
    {
        $this->aTags = $p_aTags;
        $this->aAttr = $p_aAttr;
    }
    /**
     * Process the String.
     * @param string $p_sInput
     * @return string
     */
    public function process($p_sInput)
    {
        list ($bReturn, $sInput) = $this->filter($p_sInput);
        if (!$bReturn) {
            $sInput = $this->process($sInput);
        }
        return $sInput;
    }
    /**
     * Filter.
     * @param string $p_sInput
     * @return array
     */
    private function filter($p_sInput){
        $aMatches = array();
        $sPattern = '/<([a-zA-Z0-9]+).*?>.*?<\/\1>/';
        preg_match_all($sPattern, $p_sInput, $aMatches);
        $sInput = $p_sInput;
        $bReturn = true;
        if (!empty($aMatches1)) {
            list ($aContents, $aTags) = $aMatches;
            foreach ($aTags as $iKey => $sTag) {
                if (!in_array($sTag, $this->aTags)) {
                    $bReturn = false;
                    $sInput = str_replace($aContents[$iKey], '', $sInput);
                } else {
                    $aTag = array();
                    preg_match('/<' . $sTag . '.*?>/', $aContents[$iKey], $aTag);
                    $aAttr = explode(' ', $aTag0);
                    if (!$this->checkAttr($aAttr)) {
                        $bReturn = false;
                        $sInput = str_replace($aContents[$iKey], '', $sInput);
                    }
                }
            }
        }
        return array($bReturn, trim($sInput));
    }
    /**
     * Check tags' attributes.
     * @param array $p_aAttr
     * @return bool
     */
    private function checkAttr($p_aAttr)
    {
        $bResult = true;
        foreach ($p_aAttr as $sAttr) {
            $sAttrName = strstr($sAttr, '=', true);
            if ($sAttrName === false) {
                continue;
            }
            if (!in_array($sAttrName, $this->aAttr)) {
                $bResult = false;
            }
        }
        return $bResult;
    }
}
$obj = new XssFilter(array(), array('alt','title','src'));
$str2 = '<h3><h1>dear</h1></<span>Hello</span>h3><div class="no">world</div><div id="ha">My name is</div>liuxd<img aid="4702" alt="大撒旦撒打算的" class="zoom" file="http://www.oschina.net/img/logo.svg?date=20151013" id="aimg_4702" initialized="true" inpost="1" src="http://www.oschina.net/img/logo.svg?date=20151013" style="word-wrap: break-word; cursor: pointer;" title="大撒旦撒打算的" width="600" zoomfile="http://www.oschina.net/img/logo.svg?date=20151013" />';
$r2 = $obj->process($str2);
echo $r2;



解决了,谢谢大家,也贴出来,后面大家碰到可以用,两个解决方法

一个是:使用这个组件,http://stackoverflow.com/questions/9897214/how-to-strip-specific-tags-and-specific-attributes-from-a-string

二个是:使用php函数strip_tags这个方法,第二个参数可以带你不想要过滤的标签

比如:

$body = strip_tags($body,'<img><a>');
$body = preg_replace("/<img(.*)src\s*=\s*\"([^\"]+)\"[^>]+>/isU","<img src='\\2' />",$body);




function rehtml($data){
	$data = preg_replace("/<em([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/em>/i", "", $data);
	$data = preg_replace("/<img([^>]+)?>/i", "", $data);
	$data = preg_replace("/<div([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/div>/i", "", $data);
	$data = preg_replace("/<table([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/table>/i", "", $data);
	$data = preg_replace("/<tr([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/tr>/i", "", $data);
	$data = preg_replace("/<td([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/td>/i", "", $data);
	$data = preg_replace("/<tbody([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/tbody>/i", "", $data);
	$data = preg_replace("/<strong([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/strong>/i", "", $data);
	$data = preg_replace("/<p([^>]+)?>/i", "<p>", $data);
	$data = preg_replace("/<span([^>]+)?>/i", "<p>", $data);
	$data = preg_replace("/<\/span>/i", "</p>", $data);
	$data = preg_replace("/<h1([^>]+)?>.*<\/h1>/i", "", $data);
	$data = preg_replace("/<h2([^>]+)?>.*<\/h2>/i", "", $data);
	$data = preg_replace("/<font([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/font>/i", "", $data);
	$data = preg_replace("/<center([^>]+)?>/i", "", $data);
	$data = preg_replace("/<\/center>/i", "", $data);
	$data = preg_replace("/<b ([^>]+)?>.*?<\/b>/i", "", $data);
	$data = preg_replace("/<a [^>]*>.*?<\/a>/i", "", $data);
	return $data;
}




顶部