X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Furl_parser.php;h=2fb2d3a67450725354f0384b08b6023a9fea1257;hp=ad2fa4839e6c3b86d6838d8e151b6e69b65ad5a2;hb=ce39317491517268fe421d95b7329bbe80a2fe8d;hpb=245a6892bf5c780904ef9677f24d624ea17e0749 diff --git a/functions/url_parser.php b/functions/url_parser.php index ad2fa483..2fb2d3a6 100644 --- a/functions/url_parser.php +++ b/functions/url_parser.php @@ -2,49 +2,53 @@ /* URL Passing code to allow links from with in emails */ /* $Id$ */ - $url_parser_php = true; + if (defined('url_parser_php')) + return; + define('url_parser_php', true); - function replaceBlock ($in, $replace, $start, $end) { + function replaceBlock (&$in, $replace, $start, $end) { $begin = substr($in,0,$start); $end = substr($in,$end,strlen($in)-$end); - $ret = $begin.$replace.$end; - return $ret; + $in = $begin.$replace.$end; } + // Having this defined in just one spot could help when changes need + // to be made to the pattern + // Make sure that the expression is evaluated case insensitively + // + // Here's pretty sophisticated IP matching: + // $IPMatch = '(2[0-5][0-9]|1?[0-9]{1,2})'; + // $IPMatch = '\[?' . $IPMatch . '(\.' . $IPMatch . '){3}\]?'; + // + // Here's enough: + global $IP_RegExp_Match, $Host_RegExp_Match, $Email_RegExp_Match; + $IP_RegExp_Match = '\\[?[0-9]{1,3}(\\.[0-9]{1,3}){3}\\]?'; + $Host_RegExp_Match = '(' . $IP_RegExp_Match . + '|[0-9a-z]([-.]?[0-9a-z])*\\.[a-z][a-z]+)'; + $Email_RegExp_Match = '[0-9a-z]([-_.]?[0-9a-z])*(%' . $Host_RegExp_Match . + ')?@' . $Host_RegExp_Match; + function parseEmail (&$body) { - global $color; + global $color, $Email_RegExp_Match; $Size = strlen($body); - // Having this defined in just one spot could help when changes need - // to be made to the pattern - // Make sure that the expression is evaluated case insensitively - // - // Here's pretty sophisticated IP matching: - // $IPMatch = '(2[0-5][0-9]|1?[0-9]{1,2})'; - // $IPMatch = '\[?' . $IPMatch . '(\.' . $IPMatch . '){3}\]?'; - // - // Here's enough: - $IPMatch = '\[?[0-9]{1,3}(\.[0-9]{1,3}){3}\]?'; - $Host = '(' . $IPMatch . '|[0-9a-z]([-.]?[0-9a-z])*\.[a-wyz][a-z](g|l|m|pa|t|u|v)?)'; - $Expression = '[0-9a-z]([-_.]?[0-9a-z])*(%' . $Host . ')?@' . $Host; - /* This is here in case we ever decide to use highlighting of searched text. this does it for email addresses if ($what && ($where == "BODY" || $where == "TEXT")) { - eregi ($Expression, $body, $regs); + eregi ($Email_RegExp_Match, $body, $regs); $oldaddr = $regs[0]; if ($oldaddr) { $newaddr = eregi_replace ($what, "$what", $oldaddr); $body = str_replace ($oldaddr, "$newaddr", $body); } } else { - $body = eregi_replace ($Expression, "\\0", $body); + $body = eregi_replace ($Email_RegExp_Match, "\\0", $body); } */ - $body = eregi_replace ($Expression, "\\0", $body); + $body = eregi_replace ($Email_RegExp_Match, "\\0", $body); // If there are any changes, it'll just get bigger. if ($Size != strlen($body)) @@ -53,20 +57,26 @@ } - function parseUrl (&$body) - { - $url_tokens = array( - 'http://', - 'https://', - 'ftp://', - 'telnet:', // Special case -- doesn't need the slashes - 'gopher://', - 'news://'); + // We don't want to re-initialize this stuff for every line. Save work + // and just do it once here. + global $url_parser_url_tokens; + $url_parser_url_tokens = array( + 'http://', + 'https://', + 'ftp://', + 'telnet:', // Special case -- doesn't need the slashes + 'gopher://', + 'news://'); - $poss_ends = array(' ', '\n', '\r', '<', '>', '.\r', '.\n', '. ', - ' ', ')', '(', '"', '<', '>', '.<', ']', '[', '{', - '}', "\240"); + global $url_parser_poss_ends; + $url_parser_poss_ends = array(' ', "\n", "\r", '<', '>', ".\r", ".\n", + '. ', ' ', ')', '(', '"', '<', '>', '.<', + ']', '[', '{', '}', "\240"); + + function parseUrl (&$body) + { + global $url_parser_poss_ends, $url_parser_url_tokens;; $start = 0; $target_pos = strlen($body); @@ -75,7 +85,7 @@ $target_token = ''; // Find the first token to replace - foreach ($url_tokens as $the_token) + foreach ($url_parser_url_tokens as $the_token) { $pos = strpos(strtolower($body), $the_token, $start); if (is_int($pos) && $pos < $target_pos) @@ -90,7 +100,7 @@ if (parseEmail($check_str)) { - $body = replaceBlock($body, $check_str, $start, $target_pos); + replaceBlock($body, $check_str, $start, $target_pos); $target_pos = strlen($check_str) + $start; } @@ -99,7 +109,7 @@ { // Find the end of the URL $end=strlen($body); - foreach ($poss_ends as $key => $val) + foreach ($url_parser_poss_ends as $key => $val) { $enda = strpos($body,$val,$target_pos); if (is_int($enda) && $enda < $end) @@ -113,7 +123,7 @@ if ($url != '' && $url != $target_token) { $url_str = "$url"; - $body = replaceBlock($body,$url_str,$target_pos,$end); + replaceBlock($body,$url_str,$target_pos,$end); $target_pos += strlen($url_str); } else