我试图将htmlpurifier配置为只将外部链接显示为纯文本。我使用了displayLinkUri选项,但它将所有链接显示为纯文本。有配置吗?这是我的代码:

$mySite='<a href="http://www.mysite.com/">mysite</a>';
$externalSite='<a href="http://www.external.com/">external</a>';
 require_once 'include/htmlpurifier/library/HTMLPurifier.auto.php';
                        $Config = HTMLPurifier_Config::createDefault();
                        $Config->set('AutoFormat.DisplayLinkURI', true);
                        $purifier = new HTMLPurifier($Config);
                        $mySite= $purifier->purify($mySite);
                        $externalSite=$purifier->purify($externalSite);
                        echo $mySite;
                        echo $externalSite;

输出是
<a>mysite</a> (http://www.mysite.com/)
<a>external</a> (http://www.external.com/)

我希望输出如下:
<a href="http://www.mysite.com/">mysite</a>
<a>external</a> (http://www.external.com/)

更新:
我想保持图像的外部链接不变。我只需要将超链接转换为纯文本。

最佳答案

好的,我成功地向htmlpurifier添加了一个自定义注入器,这里是:
首先,在“include\htmlpurifier\library\htmlpurifier\injector”中创建一个“displayRemoteLinkUri.php”,并将其写入其中

<?php

class HTMLPurifier_Injector_DisplayRemoteLinkURI extends HTMLPurifier_Injector
{

    public $name = 'DisplayRemoteLinkURI';
    public $needed = array('a');

    public function handleElement(&$token) {
    }

    public function handleEnd(&$token) {
        if (isset($token->start->attr['href'])){
            $url = $token->start->attr['href'];
            if($this->is_remote($url)){
                unset($token->start->attr['href']);
                $token = array($token, new HTMLPurifier_Token_Text(" ($url)"));
            }
        } else {
            // nothing to display
        }
    }

    public function is_remote($path){
        $urlvar = parse_url($path);
        $remote_schemes = array("mailto");
        $local_schemes = array("javascript");

        if(in_array($urlvar["scheme"],$remote_schemes)){
             return true;
        }else if(in_array($urlvar["scheme"],$local_schemes)){
             return false;
        }else{
             if(empty($urlvar["host"]) || $urlvar["host"]==$_SERVER["HTTP_HOST"]){
                  return false;
             }else{
                  return true;
             }
        }
    }
}

?>

然后在“include\htmlpurifier\library\htmlpurifier\configschema\schema”中创建另一个名为“autoformat.displayRemoteLinkUri.txt”的文件,并添加以下内容:
AutoFormat.DisplayRemoteLinkURI
TYPE: bool
VERSION: 3.2.0
DEFAULT: false
--DESCRIPTION--
<p>
  This directive turns on the in-text display of Remote URIs in &lt;a&gt; tags, and disables
  those links. For example, <a href="http://example.com">example</a> becomes
example (<a>http://example.com</a>).
</p>
--# vim: et sw=4 sts=4

在那之后,加上这一行
require 'HTMLPurifier/Injector/DisplayRemoteLinkURI.php';

在下面
require 'HTMLPurifier/Injector/DisplayLinkURI.php';

在include\htmlpurifier\library\htmlpurifier.includes.php中
然后,添加这一行
require_once $__dir . '/HTMLPurifier/Injector/DisplayRemoteLinkURI.php';

在下面
require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';

在include\htmlpurifier\library\htmlpurifier.safe-includes.php中
在这些编辑之后,如果文件位于本地,请运行cmd.exe并转到php目录。然后从php.exe运行“include/htmlpurifier/maintenance/generate schema cache.php”。
或者,如果您想通过浏览器执行此操作,请将“include/htmlpurifier/maintenance/”中的.htaccess文件重命名为其他文件一段时间,然后在<?php标记后的第一行的“generate schema cache.php”中添加这一行;
php_set_env("PHP_IS_CLI",true);

然后从浏览器运行此文件。在你看到“保存模式..完成了!”,重新命名.htaccess文件。
然后在脚本中,使用“autoformat.displayRemoteLinkUri”作为配置,瞧!
请注意,我在这里提供的第一个文件中的is_remote()函数可能不太好,而且我找不到检查链接是远程链接还是本地链接的脚本,因此如果需要,可以稍后对其进行更改。

关于php - 配置HTMLPurifier将外部链接显示为纯文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9765982/

10-10 03:18