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.
source to share
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 <a> 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 ...
source to share
I believe this is the one you are looking for
http://htmlpurifier.org/live/configdoc/plain.html#URI.DisableExternal
source to share
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
source to share