tags $body = addBreaks($body); // create hyperlinks for http:// addresses // there's a testcase for this in /build/testcases/urllinking.txt $replace_from = array( '/([^:\/\/\w]|^)((https:\/\/)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i', '/([^:\/\/\w]|^)((http:\/\/|www\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i', '/([^:\/\/\w]|^)((ftp:\/\/|ftp\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/i', '/([^:\/\/\w]|^)(mailto:(([a-zA-Z\@\%\.\-\+_])+))/i' ); $body = preg_replace_callback($replace_from, array('self', 'prepareBody_cb'), $body); return $body; } /** * Creates a link code for unlinked URLs with different protocols * * @ static */ function createLinkCode($pre, $url, $protocol = 'http') { $post = ''; // it's possible that $url ends contains entities we don't want, // since htmlspecialchars is applied _before_ URL linking // move the part of URL, starting from the disallowed entity to the 'post' link part $aBadEntities = array('"', '>', '<'); foreach ($aBadEntities as $entity) { $pos = strpos($url, $entity); if ($pos) { $post = substr($url, $pos) . $post; $url = substr($url, 0, $pos); } } // remove entities at end (&&&&) if (preg_match('/(&\w+;)+$/i', $url, $matches) ) { $post = $matches[0] . $post; // found entities (1 or more) $url = substr($url, 0, strlen($url) - strlen($post) ); } // move ending comma from url to 'post' part if (substr($url, strlen($url) - 1) == ',') { $url = substr($url, 0, strlen($url) - 1); $post = ',' . $post; } # replaced ereg() below with preg_match(). ereg* functions are deprecated in PHP 5.3.0 # original ereg: ereg('^' . $protocol . '://', $url) if (!preg_match('#^' . $protocol . '://#', $url) ) { $linkedUrl = $protocol . ( ($protocol == 'mailto') ? ':' : '://') . $url; } else { $linkedUrl = $url; } if ($protocol != 'mailto') { $displayedUrl = $linkedUrl; } else { $displayedUrl = $url; } return $pre . '' . shorten($displayedUrl,30,'...') . '' . $post; } /** * This method is a callback for creating link codes * @param array $match * @return string */ function prepareBody_cb($match) { if ( !preg_match('/^[a-z]+/i', $match[2], $protocol) ) { return $match[0]; } switch( strtolower($protocol[0]) ) { case 'https': return self::createLinkCode($match[1], $match[2], 'https'); break; case 'ftp': return self::createLinkCode($match[1], $match[2], 'ftp'); break; case 'mailto': return self::createLinkCode($match[1], $match[3], 'mailto'); break; default: return self::createLinkCode($match[1], $match[2], 'http'); break; } } } ?>