#! /usr/bin/perl
use strict;
use warnings;
use URI::Find::Schemeless;
use HTML::Entities qw(encode_entities); # changed
my $text = q~
hello this is no.url
this is an url: www.fabiani.net
ftp.anything.de/test/thisfile mailto:martin@fabiani.net or the like
yeah martin@fabiani.net http://www.fabiani.net/
~;
# create a new URI::Find::Schemeless objekt and add as callback
# the function what shell be done with each found URI
my $finder = URI::Find::Schemeless->new
(
sub {
my ($uri, $originalUri) = @_;
# error: encode_entities is missing
# return qq~<a href="$uri" target="_newpage">$originalUri</a>~;
return
q/<a href="/ . encode_entities("$uri") . q/">/ .
encode_entities($originalUri) . q/>/;
}
);
# here starts the search (and in our case the replacement):
my $howManyFound = $finder->find(\$text);
# lets have a look at the result
print "$howManyFound URIs found\n";
print "$text\n";
This will replace the following URIs:
- www.fabiani.net
- ftp.anything.de/test/thisfile
- mailto:martin@fabiani.net
- http://www.fabiani.net/
If you just want to replace the following URIs, use URI::Find, which is more strict:
- mailto:martin@fabiani.net
- http://www.fabiani.net/
You can do this by killing ::Schemeless:
use URI::Find; # instead of URI::Find::Schemeless
...
my $finder = URI::Find->new # instead of URI::Find::Schemeless
(
sub {
my ($uri, $originalUri) = @_;
# error: encode_entities is missing
# return qq~<a href="$uri" target="_newpage">$originalUri</a>~;
return
q/<a href="/ . encode_entities("$uri") . q/">/ .
encode_entities($originalUri) . q/>/;
}
);
...
If you dont want the Links to open a browser in a new window, just kill
target="_newpage"
It is just a shame that these modules are not standard modules of perl, but I hope that they soon will become.
If your provider hasn't installed them and doesn't want to, just copy the directorries of URI to your webpath, e.g. to cgi-bin/lib and load them perhaps from your cgi-scripts which are located in cgi-bin with the modules FindBin and lib:
BEGIN {
use FindBin qw($Bin);
use lib "$Bin/lib";
}
use URI::Find::Schemeless;
Big thanks to mdupont for pointing me to the new interface of URI::Find (was working with find_uris for a long time, and with a piece of code much too complicated)
Best regards,
strat