Php 修改HTML净化器中的所有链接

Php 修改HTML净化器中的所有链接,php,htmlpurifier,Php,Htmlpurifier,我正在使用HTML净化器删除所有不必要的/恶意的HTML标记 $html = 'dirty html provided by user'; $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.Allowed', 'p,a[href], ... other tags); $purifier = new HTMLPurifier($config);; $output = $purifier->purify(

我正在使用HTML净化器删除所有不必要的/恶意的HTML标记

$html = 'dirty html provided by user';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'p,a[href], ... other tags);
$purifier = new HTMLPurifier($config);;
$output = $purifier->purify($html);
这真的很好,但我想多做一点。我想将我所有的
更改为类似
的其他内容

在搜索了一点之后,我发现以下内容是相关的,但问题是它需要修补一个复杂的库(这不是一个好主意,解决方案也有点复杂)

通过阅读他们的,似乎有添加nofollow参数的解决方案是
$config->set(“HTML.nofollow”,true),但我仍然无法找到如何修改每个链接


我目前的解决方案是自己解析净化后的html并修改链接,但我认为有一种方法可以通过
html净化器
实现这一点,您可以使用
preg\u replace()
。正则表达式将是:

/<a href='(\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])'>([a-zA-Z0-9\s._\-]*)<\/a>/
$pattern = "/<a href='(\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])'>([a-zA-Z0-9\s._\-]*)<\/a>/";
$replacement = "<a href='$1' rel='nofollow' target='_blank'>$2</a>";
$html = preg_replace($pattern, $replacement, $html);
$replacement = "<a href='".somefunction("$1")."' rel='nofollow' target='_blank'>$2</a>";

事实上,我在上面找到了部分解决方案

这就是我需要做的:

$config->set('HTML.Nofollow', true);
$config->set('HTML.TargetBlank', true);
因此,整个过程如下所示:

$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Nofollow', true);
$config->set('HTML.TargetBlank', true);
$config->set('HTML.Allowed', 'a,b,strong,i,em,u');
$purifier = new HTMLPurifier($config);

Htmlpurifier提供了URL篡改的API

基本上创建一个过滤器类,如

class HTMLPurifier_URIFilter_MyPostFilter extends HTMLPurifier_URIFilter
{
    public $name = 'MyPostFilter';
    public $post = true;
    public function prepare($config) {}
    public function filter(&$uri, $config, $context) {
        // ... extra code here
    }
}
你可以在过滤功能中发挥你的魔力。在文档中查看传递的url对象的语义

然后,您可以使用以下命令激活过滤器:

$uri = $config->getDefinition('URI');
$uri->addFilter(new HTMLPurifier_URIFilter_MyPostFilter(), $config);

谢谢,但这和我现在做的很相似。我在看HtmlPurifier中是否有这样做的方法添加了在HtmlPurifier中添加属性的示例,tho.酷,谢谢。另外,这并不是我想要的,这是一个很好的起点。你可以在这里找到一些关于如何使用HTML净化器来修改HTML的信息——我不是把它作为一个答案发布的,因为它与你想要的正好相反:),但是你可以在这里找到一些关于属性处理的有趣信息。
$uri = $config->getDefinition('URI');
$uri->addFilter(new HTMLPurifier_URIFilter_MyPostFilter(), $config);