Php 修改HTML净化器中的所有链接
我正在使用HTML净化器删除所有不必要的/恶意的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 = '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);