1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
<?php
/**
* url_parser.php
*
* Copyright (c) 1999-2002 The SquirrelMail Project Team
* Licensed under the GNU GPL. For full terms see the file COPYING.
*
* This code provides various string manipulation functions that are
* used by the rest of the Squirrelmail code.
*
* $Id: url_parser.php,v 1.39 2002/03/02 20:28:33 simond Exp $
*/
function replaceBlock (&$in, $replace, $start, $end) {
$begin = substr($in,0,$start);
$end = substr($in,$end,strlen($in)-$end);
$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, $Email_RegExp_Match, $compose_new_win;
$Size = strlen($body);
/*
* 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 ($Email_RegExp_Match, $body, $regs);
* $oldaddr = $regs[0];
* if ($oldaddr) {
* $newaddr = eregi_replace ($what, "<b><font color=\"$color[2]\">$what</font></font></b>", $oldaddr);
* $body = str_replace ($oldaddr, "<a href=\"../src/compose.php?send_to=$oldaddr\">$newaddr</a>", $body);
* }
* } else {
* $body = eregi_replace ($Email_RegExp_Match, "<a href=\"../src/compose.php?send_to=\\0\">\\0</a>", $body);
* }
*/
if( eregi($Email_RegExp_Match, $body, $regs) ) {
if ($compose_new_win == '1') {
$body = str_replace($regs[0], '<a href="../src/compose.php?send_to='.urlencode($regs[0]).'" target="compose_window" onClick="comp_in_new()">'.$regs[0].'</a>', $body);
}
else {
$body = str_replace($regs[0], '<a href="../src/compose.php?send_to='.
urlencode($regs[0]).'">'.$regs[0].'</a>', $body);
}
}
/* If there are any changes, it'll just get bigger. */
if ($Size != strlen($body)) {
return 1;
}
return 0;
}
/* 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://');
global $url_parser_poss_ends;
$url_parser_poss_ends = array(' ', "\n", "\r", '<', '>', ".\r", ".\n",
'. ', ' ', ')', '(', '"', '<', '>', '.<',
']', '[', '{', '}', "\240", ', ', '. ', ",\n", ",\r");
function parseUrl (&$body) {
global $url_parser_poss_ends, $url_parser_url_tokens;;
$start = 0;
$target_pos = strlen($body);
while ($start != $target_pos) {
$target_token = '';
/* Find the first token to replace */
foreach ($url_parser_url_tokens as $the_token) {
$pos = strpos(strtolower($body), $the_token, $start);
if (is_int($pos) && $pos < $target_pos) {
$target_pos = $pos;
$target_token = $the_token;
}
}
/* Look for email addresses between $start and $target_pos */
$check_str = substr($body, $start, $target_pos);
if (parseEmail($check_str)) {
replaceBlock($body, $check_str, $start, $target_pos);
$target_pos = strlen($check_str) + $start;
}
/* If there was a token to replace, replace it */
if ($target_token != '') {
/* Find the end of the URL */
$end=strlen($body);
foreach ($url_parser_poss_ends as $key => $val) {
$enda = strpos($body,$val,$target_pos);
if (is_int($enda) && $enda < $end) {
$end = $enda;
}
}
/* Extract URL */
$url = substr($body, $target_pos, $end-$target_pos);
/* Needed since lines are not passed with \n or \r */
while ( ereg("[,\.]$", $url) ) {
$url = substr( $url, 0, -1 );
$end--;
}
/* Replace URL with HyperLinked Url, requires 1 char in link */
if ($url != '' && $url != $target_token) {
$url_str = "<a href=\"$url\" target=\"_blank\">$url</a>";
replaceBlock($body,$url_str,$target_pos,$end);
$target_pos += strlen($url_str);
}
else {
// Not quite a valid link, skip ahead to next chance
$target_pos += strlen($target_token);
}
}
/* Move forward */
$start = $target_pos;
$target_pos = strlen($body);
}
}
?>
|