2009-11-30 50 views
0

我正在尝试解析一些HTML代码片段,并且因为各种原因想要对它们进行清理(XSS等)。将eregi_replace转换为preg_replace

我目前正试图删除任何标签上的所有属性,除了锚点上的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); 

(I只需要解析HTML标签的子集,因为这我去掉任何undesireables之前)。

回答

3

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

或者,你可以做这样的事情:

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

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

相关问题