diff options
author | Bharat Mediratta <bharat@menalto.com> | 2009-12-21 20:05:27 -0800 |
---|---|---|
committer | Bharat Mediratta <bharat@menalto.com> | 2009-12-21 20:05:27 -0800 |
commit | 9285c8c66c530196399eb05bb5561c3fa5538335 (patch) | |
tree | 7cec68583c01b5b365e7669fefc1adc6360e89a5 /system/helpers/text.php | |
parent | 9c5df1d31bd214fab051b71d092c751a1da20ecc (diff) |
Updated Kohana to r4724
Diffstat (limited to 'system/helpers/text.php')
-rw-r--r-- | system/helpers/text.php | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/system/helpers/text.php b/system/helpers/text.php index 66bcd243..ed7f9cbf 100644 --- a/system/helpers/text.php +++ b/system/helpers/text.php @@ -2,7 +2,7 @@ /** * Text helper class. * - * $Id: text.php 4679 2009-11-10 01:45:52Z isaiah $ + * $Id: text.php 4689 2009-12-02 01:39:24Z isaiah $ * * @package Core * @author Kohana Team @@ -298,27 +298,37 @@ class text_Core { */ public static function auto_link_urls($text) { - // Finds all http/https/ftp/ftps links that are not part of an existing html anchor - if (preg_match_all('~\b(?<!href="|">)(?:ht|f)tps?://\S+(?:/|\b)~i', $text, $matches)) - { - foreach ($matches[0] as $match) - { - // Replace each link with an anchor - $text = str_replace($match, html::anchor($match), $text); - } - } - // Find all naked www.links.com (without http://) - if (preg_match_all('~\b(?<!://)www(?:\.[a-z0-9][-a-z0-9]*+)+\.[a-z]{2,6}\b~i', $text, $matches)) + $regex = '~\\b' + .'((?:ht|f)tps?://)?' // protocol + .'(?:[-a-zA-Z0-9]{1,63}\.)+' // host name + .'(?:[0-9]{1,3}|aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)' // tlds + .'(?:/[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]*?)?' // path + .'(?:\?[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]+?)?' // query + .'(?:#[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]+?)?' // fragment + .'(?=[?.!,;:"]?(?:\s|$))~'; // punctuation and url end + + $result = ""; + $position = 0; + + while (preg_match($regex, $text, $match, PREG_OFFSET_CAPTURE, $position)) { - foreach ($matches[0] as $match) - { - // Replace each link with an anchor - $text = str_replace($match, html::anchor('http://'.$match, $match), $text); - } + list($url, $url_pos) = $match[0]; + + // Add the text before the url + $result .= substr($text, $position, $url_pos - $position); + + // Default to http:// + $full_url = empty($match[1][0]) ? 'http://'.$url : $url; + + // Add the hyperlink. + $result .= html::anchor($full_url, $url); + + // New position to start parsing + $position = $url_pos + strlen($url); } - return $text; + return $result.substr($text, $position); } /** |