Configuring HTMLPurifier to display external links as plain text

£可爱£侵袭症+ 提交于 2019-12-10 20:44:10

问题


I am trying to configure HTMLPurifier to only display external links as plain text. I used DisplayLinkURI option but it display all links as a plain text. is there any configuration for that? here is my code:

$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;

The output is

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

I want the output to be like this:

<a href="http://www.mysite.com/">mysite</a>
<a>external</a> (http://www.external.com/)

Update: I want to keep external links for images without change. I only need to convert hyperlinks to plain text.


回答1:


Ok, I succeeded to add a custom injector to HTMLPurifier, here it is:

First, Create a "DisplayRemoteLinkURI.php" in "include\htmlpurifier\library\HTMLPurifier\Injector" and write this in it

<?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;
             }
        }
    }
}

?>

And then create another file named "AutoFormat.DisplayRemoteLinkURI.txt" in "include\htmlpurifier\library\HTMLPurifier\ConfigSchema\schema" and add this :

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

After that, Add this line

require 'HTMLPurifier/Injector/DisplayRemoteLinkURI.php';

under

require 'HTMLPurifier/Injector/DisplayLinkURI.php';

in include\htmlpurifier\library\HTMLPurifier.includes.php

Then, Add this line

require_once $__dir . '/HTMLPurifier/Injector/DisplayRemoteLinkURI.php';

under

require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';

in include\htmlpurifier\library\HTMLPurifier.safe-includes.php

After these edits, if your files are at local, run cmd.exe and go to your php directory. Then run "include/HTMLPurifier/maintenance/generate-schema-cache.php" from php.exe.

Or if you want to do this via browser, rename your .htaccess file inside "include/HTMLPurifier/maintenance/" to something else for a while, then add this line inside "generate-schema-cache.php" on the first line after the <?php tag;

php_set_env("PHP_IS_CLI",true);

and then run this file from browser. After you see "Saving schema.. done!", rename your .htaccess file back.

Then in your script, use "AutoFormat.DisplayRemoteLinkURI" as config, and voila!

Note that the is_remote() function inside the first file I gave here might be not so good, and I couldn't find a script that checks if a link is remote or local, so you might alter it later if you need.




回答2:


I believe this is the one you're looking for

http://htmlpurifier.org/live/configdoc/plain.html#URI.DisableExternal




回答3:


There's an option named URI.DisableExternal and AutoFormat.Linkify. Set them both to TRUE and see what happens.

http://htmlpurifier.org/live/configdoc/plain.html#URI.DisableExternal

http://htmlpurifier.org/live/configdoc/plain.html#AutoFormat.Linkify

And AutoFormat.DisplayLinkURI disables all the links. I suggest you use both the above instead of AutoFormat.DisplayLinkURI.

http://htmlpurifier.org/live/configdoc/plain.html#AutoFormat.DisplayLinkURI



来源:https://stackoverflow.com/questions/9765982/configuring-htmlpurifier-to-display-external-links-as-plain-text

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!