Schlafen - was ist das ;-)
Na, dann ganz am Schluß ;-(
Äh, und Du?
Hier mal meine Suchergebnisse (und mehr):
Babylon läßt grüßen ... und vor allem eine verständliche RFC (ist selten!).
Im CPAN wird angegeben daß URI::URL:: auf dem RFC1738 (Uniform Resource Locators) basiert.
Mittlerweile ist die RFC1738 ersetzt worden durch die RFC2396.
URI::URL:: in Verbindung mit URI:: basiert auf der RFC2396 und der Aktualisierung auf IPv6 durch RFC2732.
Wer sich genauer dafür interessiert (schneller s.u.) dem empfehle ich das 2. Kapitel der RFC2396 zu überfliegen.
Dieses ist sehr gut geschrieben und gibt einen guten Einblick auf das WARUM so schwierig ;-)
http://www.armware.dk/RFC/rfc/rfc2396.html
http://www.armware.dk/RFC/rfc/rfc2732.html
Kernstück der Problematik ist die in einem vorherigen Posting angesprochene Frage wann ich escapen muß und wann ich nicht darf.
Zum Beispiel darf ich die & zwischen meinen Parametern nicht ersetzen, innerhalb muß ich sie ersetzen!
Und das ich das # immer ersetzen muß, außer, ich gebe am Ende der URL einen Anker-Verweis an!
Und so weiter...
Für das ganze gibts sogar ein vorgefertigtes Modul URI::Escape::
Die Beschreibung ist SEHR LESENSWERT!
http://search.cpan.org/author/GAAS/URI-1.22/URI/Escape.pm
Wer es kompletter haben will, der kann das Modul URI::URL:: verwenden:
http://search.cpan.org/author/GAAS/URI-1.22/URI/URL.pm
Für baseportal würde ich eine Erweiterung von convert_url() in der folgenden Form vorschlagen (sofern nicht sowieso auf die oben erwähnten Module zurückgegriffen wird):
# das gibt Geschwindigkeit (aus URI::Escape:: entnommen) hmmmm .... ob ein Array - $_urlescap[ord($_)] - nicht noch schneller ist?
for (0..255) {
$_urlescapes{chr($_)} = sprintf("%%%02X", $_);
}
sub convert_url(;$;@) {
local $_=@_>0?shift:$_; # Achtung: geändert ;-)
s/([\x00-\x1f%\\\|&"\+\x7f-\xff])/$_urlescapes{$1}/g;
# s/([^A-Za-z0-9\-_.!~*'() ])/$_urlescapes{$1}/g; hmmmm .... diese Variante wäre zwar korrekter, aber da schaut dann htx=... so seltsam aus :-(
if (@_) {
my $_cu = $_
for (@_) { s/([^A-Za-z0-9\-_.!~*'() ])/$_urlescapes{$1}/g; # um ' ' erweitert!
my $_an;
$_an = '#'.pop if @_/2>0;
while (@_) { $_cu.='&'.shift.'='.shift }
$_ = $_cu.$_an;
}
s/ /+/g;
$_;
} # hmmm ... hoffentlich stimmt überall die Syntax!
Somit gibts für convert_url folgende Verwendung (LIST2 bezeichnet eine Liste mit geradzahliger Anzahl von Elementen):
convert_url
convert_url EXPR
convert_url EXPR, LIST2
convert_url EXPR, LIST2, EXPR1
Die ersten beiden Fälle sind convert_url wie bisher :-)
Fall drei und vier hängen den Inhalt von LIST2 paarweise an EXPR in der Form &Element1=Element2 hinten dran.
Im 4. Fall (ungerade Anzahl von Elementen hinter EXPR) fügt das letzte Element (EXPR1) als Anker (mit #) hinten dran.
Für baseportal ergibt sich so die Möglichkeit, Links folgendermaßen zu erzeugen:
$htx = '/main';
$u = 'direkt#1';
$name = 'Mc.Donald & Co';
$lnk = '/baseportal'.convert_url($htx, 'u', $u, 'name', $name, 'Abschnitt2');
# $lnk enthält nun: /baseportal/main&u=direkt%231&name=Mc.Donald+%26+Co#Abschnitt2
Herzliche Grüße von Jurenda :-})
PS.: Bin bei der Suche auch noch über einiges zu convert_html gestolpert:
A) Found in HTML::Stream::
my %Escape = (
'&' => 'amp',
'>' => 'gt',
'<' => 'lt',
'"' => 'quot',
);
sub escape_all {
my $text = shift;
$text =~ s/([<>"&])/\&$Escape{$1};/mg;
$text =~ s/([\x80-\xFF])/'&#'.unpack('C',$1).';'/eg;
$text;
}
B) more complex in HTML::Entities::