0

我正在尝试解析一些 HTML 片段并出于各种原因想要清理它们(XSS 等)。

我目前正在尝试删除任何标签上的所有属性,锚点上的 href 除外。我正在使用一系列 eregi_replace 调用来执行此操作,但我确信使用 preg_replace 和几行代码可以更智能地执行此操作,但我无法让它工作。任何人都可以帮忙吗?

当前代码:

$data_item = eregi_replace("<p[^>]*>","<p>", $data_item);
$data_item = eregi_replace("<h2[^>]*>","<h2>", $data_item);
$data_item = eregi_replace("<h3[^>]*>","<h3>", $data_item);
$data_item = eregi_replace("<h4[^>]*>","<h4>", $data_item);
$data_item = eregi_replace("<h5[^>]*>","<h5>", $data_item);
$data_item = eregi_replace("<h6[^>]*>","<h6>", $data_item);
$data_item = eregi_replace("<ul[^>]*>","<ul>", $data_item);
$data_item = eregi_replace("<ol[^>]*>","<ol>", $data_item);
$data_item = eregi_replace("<li[^>]*>","<li>", $data_item);

$data_item = preg_replace("/<a([^>]*)( href=\S+)([^>]*)>/i", '<a$2 rel="nofollow">', $data_item);

(我只需要解析 HTML 标记的子集,因为在此之前我会去除任何不受欢迎的标记)。

4

1 回答 1

3

为什么不使用匹配任何标签的通用正则表达式,然后preg_replace_callback()让您确定应该用什么替换给定标签?这样你就可以有一个简单的函数来检查匹配的标签是否是一个a标签,如果是,则不替换 href,否则替换所有内容。

或者,您可以执行以下操作:

$data_item = preg_replace("/<(p|h2|h3|h4|h5|h6|ul|ol)[^>]*>/i","<$1>", $dataitem);

正则表达式中的()组捕获匹配的标记类型,|是“或”运算符以匹配任何指示的标记,$1替换文本中的 用于替换第一个(也是唯一一个)捕获匹配的内容从模式组。

于 2009-11-30T07:21:37.197 回答