+ function parseUrl ($body)
+ {
+ $url_tokens = array(
+ 'http://',
+ 'https://',
+ 'ftp://',
+ 'telnet:', // Special case -- doesn't need the slashes
+ 'gopher://',
+ 'news://');
+
+ $poss_ends = array(' ', '\n', '\r', '<', '>', '.\r', '.\n', '. ',
+ ' ', ')', '(', '"', '<', '>', '.<', ']', '[', '{',
+ '}', "\240");
+
+ $start = 0;
+ $target_pos = strlen($body);
+
+ while ($start != $target_pos)
+ {
+ $target_token = '';
+
+ // Find the first token to replace
+ foreach ($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);
+ $new_str = parseEmail($check_str);
+
+ if ($check_str != $new_str)
+ {
+ $body = replaceBlock($body, $new_str, $start, $target_pos);
+ $target_pos = strlen($new_str) + $start;
+ }
+
+ // If there was a token to replace, replace it
+ if ($target_token != '')
+ {
+ // Find the end of the URL
+ $end=strlen($body);
+ foreach ($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);
+
+ // Replace URL with HyperLinked Url, requires 1 char in link
+ if ($url != '' && $url != $target_token)
+ {
+ $url_str = "<a href=\"$url\" target=\"_blank\">$url</a>";
+ $body = 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);
+ }
+
+ return $body;
+ }
+
+?>