Configuring HTMLPurifier to Display External Links as Plain Text

I am trying to set up an HTMLPurifier to only display external links as plain text. I used the DisplayLinkURI parameter, but it displays all links as plain text. is there any configuration for this? 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;

      

Output signal

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

      

I want the result to be like this:

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

      

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

+3


source to share


3 answers


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

First create " DisplayRemoteLinkURI.php" in " include \ htmlpurifier \ library \ HTMLPurifier \ Injector " and write 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 changes, if your files are on your local machine, run cmd.exe and change to the php directory. Then run "include / HTMLPurifier / maintenance / generate-schema-cache.php" from php.exe.

Or if you want to do it through the browser, rename the .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 tag <?php

;

php_set_env("PHP_IS_CLI",true);

      

and then run this file from browser. After you see "Saving the schema .. done!", Rename the .htaccess file .

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

Note that the is_remote () function inside the first file I brought here may not be very good and I could not find a script that checks if a link is remote or local, so you can change it later if you need ...

0


source


I believe this is the one you are looking for



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

+3


source


There is an option named URI.DisableExternal and AutoFormat.Linkify. Set them 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 links. I suggest you use both of the above and not AutoFormat.DisplayLinkURI.

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

+1


source







All Articles