求一个PHP正则表达式把html中的所有标签属性全部去掉

发布于 2021-11-30 00:48:58 字数 864 浏览 831 评论 14

一、用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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

像你 2021-12-04 14:12:31

嗯,是的,这个确实有点强大。

兮颜 2021-12-04 14:12:31
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;
}

爱的故事 2021-12-04 14:12:27

使用起来还是比较简单的。这个是做html文档标准化的。可以防止各种各样的xss代码。

旧城烟雨 2021-12-04 14:12:26

htmlpurifier.org 我们的蝉知
建站系统的html标准化使用的就是这套类库。功能相当强大。

静谧 2021-12-04 14:12:18

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

一个是:使用这个组件,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(.*)srcs*=s*"([^"]+)"[^>]+>/isU","<img src='\2' />",$body);

囚你心 2021-12-04 14:11:56

引用来自“Liuxd”的评论

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

试试这个。

苍暮颜 2021-12-04 14:06:37

怎么解析dom?

别低头,皇冠会掉 2021-12-04 14:05:12

正则不是很熟啊,这种情况如果是我会解析dom然后重新生成!

策马西风 2021-12-04 14:01:10

大神呢

已下线请稍等 2021-12-04 13:40:55

这个代码我试了下,好像不行

终遇你 2021-12-04 10:27:27

哦?php内置的什么方法,还这不知道

丢了幸福的猪 2021-12-03 20:52:43

strip_tags这个方法是可以,但会全部干掉,但是我要保留img标签怎么破,还有a标签的title属性之类的

离不开的别离 2021-12-03 04:35:49

明白了,这个函数还有第二个参数

反话 2021-12-01 20:32:53

为什么要用正则 PHP 有过滤方法呀 内置的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文