[Tiki-devel] Function for encoding anchor names

Volker Wysk <post-hhF2Jplw28UoZk/[email protected]>
Newsgroups gmane.comp.cms.tiki.devel
Message-ID <[email protected]>
Hi!

I've written a PHP function which does a standards-compliant encoding of an
anchor name to a URL fragment string (the part of an URL after the "#").

Now this function needs to be used in Tiki.

See attachment.

Volker

_______________________________________________
TikiWiki-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-devel
url.php (application/x-php, 2.2 KB)
<?php

function url_fragment_string($txt)
{
    $arr = mb_str_split($txt);
    $frag = "";

    for ($i = 0; $i < count($arr); $i++) {
        $chr = $arr[$i];
        $ord = IntlChar::ord($chr);

        if ($chr == " ") {
            // Encode spaces by hyphens.
            $frag .= "-";
        } else {

            if ( // URL code points
                (ctype_alnum($chr)
                 || $chr == "!" || $chr == "$" || $chr == "&" || $chr == "'" || $chr == "(" || $chr == ")"
                 || $chr == "*" || $chr == "+" || $chr == "," || $chr == "-" || $chr == "." || $chr == "/"
                 || $chr == ":" || $chr == ";" || $chr == "=" || $chr == "?" || $chr == "@" || $chr == "_"
                 || $chr == "~"
                 || ($ord >= 0x00A0 && $ord <= 0x10FFFD))

                // surrogates
                && !($ord >= 0xD800 && $ord <= 0xDFFF)

                // noncharacters
                && !( ($ord >= 0xFDD0 && $ord <= 0xFDEF)
                      || $ord == 0xFFFE || $ord == 0xFFFF || $ord == 0x1FFFE || $ord == 0x1FFFF
                      || $ord == 0x2FFFE || $ord == 0x2FFFF || $ord == 0x3FFFE || $ord == 0x3FFFF
                      || $ord == 0x4FFFE || $ord == 0x4FFFF || $ord == 0x5FFFE || $ord == 0x5FFFF
                      || $ord == 0x6FFFE || $ord == 0x6FFFF || $ord == 0x7FFFE || $ord == 0x7FFFF
                      || $ord == 0x8FFFE || $ord == 0x8FFFF || $ord == 0x9FFFE || $ord == 0x9FFFF
                      || $ord == 0xAFFFE || $ord == 0xAFFFF || $ord == 0xBFFFE || $ord == 0xBFFFF
                      || $ord == 0xCFFFE || $ord == 0xCFFFF || $ord == 0xDFFFE || $ord == 0xDFFFF
                      || $ord == 0xEFFFE || $ord == 0xEFFFF || $ord == 0xFFFFE || $ord == 0xFFFFF
                      || $ord == 0x10FFFE || $ord == 0x10FFFF)
            )
            {
                $frag .= $chr;
            } else {
                // Unallowed characters - must be percent-encoded.
                $bytes = str_split($chr);
                for ($j = 0; $j < count($bytes); $j++) {
                    $frag .= "%" . bin2hex($bytes[$j]);
                }
            }
        }
    }

    return $frag;
}

// Test: echo url_fragment_string("abc关一条!!äöü 龙服务  Tiki ist gut.");
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEE6QXGh82Ov3+2nrxp+K4ydFOsHoUFAmP4R/YACgkQ+K4ydFOs
HoU3TQ/+OeqXqr95r2gXobVCrpPdsDj+8/jnSlQLLrKxPVElrK770XS1V7qb2qRk
LUPmTBjuCfcfgZRenirozoilT8E0BbRbd5X2O2T0qZeZbw7KMR8QtHVg+iEQ2j/k
XqoQFpkDm+PkxxdI07TSNY8KrMw/N2BZjvvYJhNcUH5VqW7TuOO3iADS+si5Kltu
9a8HasThrnOUySd9wm6VMx/77RaodcIfeBSHG/ywMqormXSHp4/vGZhilB632k77
ll83hXMTFTI5C+Br9ED8ny14GGz/Sk/DApaBcOH4ZZFyMbC8vukrbw4n9eFLxPIB
YuQ6YKRhtvyUPfcg8j9KVT5ngse71ZzgoiTPlav9lZPkUJEVeYrlkD3TANpoQCl+
OGOxNeZBoBSlJ8sZaWDj/wWVSuE8EJXvSORfhwZJJOS+2HF17A44RPDPSW96IyLw
9/hEvjSmvLeWry7wEnRGr3dymeX4vpPoPxz/n+VJ24DFIR92gRQc40qQWkhT/yqz
jBbY1eTj2NiOvXmBoYR1VYpjmWNW4Vv9OWrqQUr1OWt4jYUgHw2WXg2AEj7JNhT4
UMFnvje28nThjyUWHju4IbJe3EljEK2EWvBQq35tdeRyX8aqGbOHCzrrwObLgvQG
F6UeKeLb+KwFhP/Te0d1GFkOq155Gp4KF+l0vl9sDFk4vrOdoyg=
=4MJ4
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.