Files
selima-perl/lib/php/monica/rfc1738.inc.php
2026-03-10 21:31:43 +08:00

111 lines
5.5 KiB
PHP

<?php
// File name: rfc1738.inc.php
// Description: PHP regular expressions for RFC 1738 URL patterns
// Date: 2004-02-11
// Author: imacat <imacat@pristine.com.tw>
// Copyright: Copyright (C) 2004-2007 Pristine Communications
// Set the include path
if (!defined("INCPATH_SET")) {
require_once dirname(__FILE__) . "/incpath.inc.php";
}
// Referenced subroutines
require_once "monica/rfc822.inc.php";
require_once "monica/html401.inc.php";
define("RFC1738_ALPHA", "[A-Za-z]");
define("RFC1738_DIGIT", "\\d");
define("RFC1738_DIGITS", "\\d+");
define("RFC1738_HEX", "[\\dA-Fa-f]");
define("RFC1738_ALPHADIGIT", "[A-Za-z\\d]");
define("RFC1738_SAFE", "[$\\-_\\.+]");
define("RFC1738_EXTRA", "[!*'(),]");
define("RFC1738_ESCAPE", "%" . RFC1738_HEX . "{2}");
define("RFC1738_RESERVED", "[;\\/?:@&=]");
// Alpha, digit, safe, extra
define("RFC1738_UNRESERVED", "[A-Za-z\\d$\\-_\\.+!*'(),]");
// Unreserved, reserved, escape
define("RFC1738_XCHAR", "(?:[A-Za-z\\d$\\-_\\.+!*'(),;\\/?:@&=]|" . RFC1738_ESCAPE . ")");
define("RFC1738_UCHAR", "(?:" . RFC1738_UNRESERVED . "|" . RFC1738_ESCAPE . ")");
define("RFC1738_SCHEME", "[A-Za-z\\d+\\-\\.]+");
define("RFC1738_DOMAINLABEL", "(?:" . RFC1738_ALPHADIGIT . "|"
. RFC1738_ALPHADIGIT . "(?:" . RFC1738_ALPHADIGIT . "|-)*" . RFC1738_ALPHADIGIT . ")");
define("RFC1738_TOPLABEL", "(?:" . RFC1738_ALPHA . "(?:" . RFC1738_ALPHADIGIT . "|-)*" . RFC1738_ALPHADIGIT . "|"
. RFC1738_ALPHA . ")");
define("RFC1738_HOSTNAME", "(?:" . RFC1738_DOMAINLABEL . "\\.)*" . RFC1738_TOPLABEL);
define("RFC1738_HOSTNUMBER", "\\d+\\.\\d+\\.\\d+\\.\\d+");
define("RFC1738_HOST", "(?:" . RFC1738_HOSTNAME . "|" . RFC1738_HOSTNUMBER . ")");
define("RFC1738_PORT", RFC1738_DIGITS);
define("RFC1738_USER", "(?:" . RFC1738_UCHAR . "|[;?&=])*");
define("RFC1738_PASSWORD", "(?:" . RFC1738_UCHAR . "|[;?&=])*");
define("RFC1738_HOSTPORT", RFC1738_HOST . "(?::" . RFC1738_PORT . ")?");
define("RFC1738_LOGIN", "(?:" . RFC1738_USER . "(?::" . RFC1738_PASSWORD . ")?@)?" . RFC1738_HOSTPORT);
// FTP, also section 3.2
define("RFC1738_FTPTYPE", "[AIDaid]");
define("RFC1738_FSEGMENT", "(?:" . RFC1738_UCHAR . "|[?:@&=])*");
define("RFC1738_FPATH", RFC1738_FSEGMENT . "(?:\\/" . RFC1738_FSEGMENT . ")*");
define("RFC1738_FTPURL", "[fF][tT][pP]:\\/\\/" . RFC1738_LOGIN . "(?:\\/" . RFC1738_FPATH . "(?:;type=" . RFC1738_FTPTYPE . ")?)?");
// FILE
define("RFC1738_FILEURL", "[fF][iI][lL][eE]:\\/\\/(?:" . RFC1738_HOST . "|localhost)?\\/" . RFC1738_FPATH);
// HTTP, also section 3.3
define("RFC1738_HSEGMENT", "(?:" . RFC1738_UCHAR . "|[;:@&=])*");
define("RFC1738_SEARCH", "(?:" . RFC1738_UCHAR . "|[;:@&=])*");
define("RFC1738_HPATH", RFC1738_HSEGMENT . "(?:\\/" . RFC1738_HSEGMENT . ")*");
// hostport should be login
define("RFC1738_HTTPURL", "[hH][tT][tT][pP]:\\/\\/" . RFC1738_HOSTPORT . "(?:\\/" . RFC1738_HPATH . "(?:\\?" . RFC1738_SEARCH . ")?)?");
// Local fix to HTTP URL
// hsegment does not include the tide "~" character (users' home direcories).
// It is a common practice now.
define("RFC1738_LOCAL_HSEGMENT", "(?:" . RFC1738_UCHAR . "|[;:@&=~])*");
// hostport should be login
define("RFC1738_LOCAL_HTTPURL", str_replace(RFC1738_HOSTPORT, RFC1738_LOGIN,
str_replace(RFC1738_HSEGMENT, RFC1738_LOCAL_HSEGMENT, RFC1738_HTTPURL))
. "(?:#" . HTML401_ID . ")?");
// HTTPS does not exist in RFC 1738
define("RFC1738_LOCAL_HTTPSURL", str_replace("[hH][tT][tT][pP]:", "[hH][tT][tT][pP][sS]:", RFC1738_HTTPURL));
// GOPHER
define("RFC1738_GTYPE", RFC1738_XCHAR);
define("RFC1738_SELECTOR", RFC1738_XCHAR . "*");
define("RFC1738_GOPHERP_STRING", RFC1738_XCHAR . "*");
define("RFC1738_GOPHERURL", "[gG][oO][pP][hH][eE][rR]:\\/\\/" . RFC1738_HOSTPORT . "(?:\\/(?:" . RFC1738_GTYPE . "(?:" . RFC1738_SELECTOR . "(?:%09" . RFC1738_SEARCH . "(?:" . RFC1738_GOPHERP_STRING . ")?)?)?)?)?");
// MAILTO
define("RFC1738_MAILTOURL", "[mM][aA][iI][lL][tT][oO]:" . RFC822_ADDR_SPEC);
// NEWS
define("RFC1738_GROUP", RFC1738_ALPHA . "[A-Za-z\\d\\-\\.+_]*");
define("RFC1738_ARTICLE", "(?:" . RFC1738_UCHAR . "|[;\\/?:&=])+@" . RFC1738_HOST);
define("RFC1738_GROUPPART", "(?:\\*|" . RFC1738_GROUP . "|" . RFC1738_ARTICLE . ")");
define("RFC1738_NEWSURL", "[nN][eE][wW][sS]:" . RFC1738_GROUPPART);
// NNTP
define("RFC1738_NNTPURL", "[nN][nN][tT][pP]:\\/\\/" . RFC1738_HOSTPORT . "\\/" . RFC1738_GROUP . "(?:\\/\\d+)?");
// TELNET
define("RFC1738_TELNETURL", "[tT][eE][lL][nN][eE][tT]:\\/\\/" . RFC1738_LOGIN . "\\/?");
// WAIS
define("RFC1738_DATABASE", RFC1738_UCHAR . "*");
define("RFC1738_WTYPE", RFC1738_UCHAR . "*");
define("RFC1738_WPATH", RFC1738_UCHAR . "*");
define("RFC1738_WAISDATABASE", "[wW][aA][iI][sS]:\\/\\/" . RFC1738_HOSTPORT . "\\/" . RFC1738_DATABASE);
define("RFC1738_WAISINDEX", "[wW][aA][iI][sS]:\\/\\/" . RFC1738_HOSTPORT . "\\/" . RFC1738_DATABASE . "\\?" . RFC1738_SEARCH);
define("RFC1738_WAISDOC", "[wW][aA][iI][sS]:\\/\\/" . RFC1738_HOSTPORT . "\\/" . RFC1738_DATABASE . "\\/" . RFC1738_WTYPE . "\\/" . RFC1738_WPATH);
define("RFC1738_WAISURL", "(?:" . RFC1738_WAISDOC . "|" . RFC1738_WAISINDEX . "|" . RFC1738_WAISDATABASE . ")");
// PROSPERO
define("RFC1738_FIELDNAME", "(?:" . RFC1738_UCHAR . "|[?:@&])*");
define("RFC1738_FIELDVALUE", "(?:" . RFC1738_UCHAR . "|[?:@&])*");
define("RFC1738_FIELDSPEC", ";" . RFC1738_FIELDNAME . "=" . RFC1738_FIELDVALUE);
define("RFC1738_PSEGMENT", "(?:" . RFC1738_UCHAR . "|[?:@&=])*");
define("RFC1738_PPATH", RFC1738_PSEGMENT . "(?:\\/" . RFC1738_PSEGMENT . ")*");
define("RFC1738_PROSPEROURL", "[pP][rR][oO][sS][pP][eE][rR][oO]:\\/\\/" . RFC1738_HOSTPORT . "\\/" . RFC1738_PPATH . "(?:" . RFC1738_FIELDSPEC . ")*");
?>