/**
  * Replaces hashtag and username with links.
  *
  * @return string
  */
 public function filter_text()
 {
     $text = htmlEscapeAndLinkUrls($this->text);
     $pattern_username = '******';
     $replacement_username = '******' . BBTF_TWITTER_URL . '/${1}">@${1}</a>';
     $text = preg_replace($pattern_username, $replacement_username, $text);
     $pattern_hashtag = '/#([a-zA-z0-9]+)/';
     $replacement_hashtag = '<a href="' . BBTF_TWITTER_URL . '/hashtag/${1}">#${1}</a>';
     $text = preg_replace($pattern_hashtag, $replacement_hashtag, $text);
     return $text;
 }
 public function view($gallery_id = 0, $current_image_index = 1, $name = '')
 {
     $this->load->model('browse_model');
     $this->load->model('comments_model');
     $this->load->model('evaluations_model');
     $this->load->library('typography');
     $this->load->helper(array('urllinker', 'urlslug', 'browse'));
     if (($gallery = $this->browse_model->get_gallery(intval($gallery_id))) === FALSE) {
         show_error("Galeria nie występuje...", 404, 'Błąd!');
     }
     if (($current_page = $this->current_page(5)) === FALSE) {
         show_error("Strona nie występuje...", 404, 'Błąd!');
     }
     $current_image_index = intval($current_image_index);
     $gallery_images = $this->browse_model->get_gallery_images($gallery_id);
     if ($current_image_index < 1 || $current_image_index > count($gallery_images)) {
         show_error("Brak pracy w galerii...", 404, 'Błąd!');
     }
     $this->data['adult_user'] = $this->adult_user;
     $all_gallery_comments = $this->comments_model->counts_gallery_comments($gallery_id);
     if ($all_gallery_comments > 0) {
         $last_page = ceil($all_gallery_comments / $this->gallery_comments_config['page_size']);
         if ($current_page > $last_page) {
             $current_page = $last_page;
         }
         $gallery_comments = $this->comments_model->get_gallery_comments($gallery_id, $this->gallery_comments_config['page_size'], $current_page);
         foreach ($gallery_comments as &$gallery_comment) {
             $gallery_comment->comment = $this->typography->auto_typography(htmlEscapeAndLinkUrls($gallery_comment->comment), TRUE);
             $gallery_comment->signature = $this->typography->auto_typography(htmlEscapeAndLinkUrls($gallery_comment->signature), TRUE);
         }
         $this->data['object_comments'] = $gallery_comments;
         $this->data['pagination_links'] = $this->pagination_links("/gallery/view/{$gallery_id}/" . $current_image_index, $this->gallery_comments_config['page_size'], $all_gallery_comments, 5);
     } else {
         $this->data['object_comments'] = array();
     }
     $this->data['can_comment'] = $gallery->can_comment;
     $this->data['comment_object_owner'] = $gallery->user_id;
     $this->data['can_evaluate'] = $gallery->can_evaluate;
     $this->data['gallery_images'] = $gallery_images;
     $this->data['current_image_index'] = $current_image_index;
     $this->data['preview_image'] = $gallery_images[$current_image_index - 1];
     if ($current_image_index - 1 > 0) {
         $this->data['previous_image_index'] = $current_image_index - 1;
     }
     if ($current_image_index + 1 <= count($this->data['gallery_images'])) {
         $this->data['next_image_index'] = $current_image_index + 1;
     }
     $cats_uri_rows = $this->browse_model->get_cats_uri_rows($this->browse_model->build_path_cats($gallery->category_id, 'galleries'), 'galleries');
     $this->data['gallery_cats_path'] = create_hierarchical_path(base_url() . 'browse/galleries/', $cats_uri_rows);
     $cats_uri_rows = $this->browse_model->get_cats_uri_rows($this->browse_model->build_path_cats($gallery_images[$current_image_index - 1]->category_id, 'images'), 'images');
     $this->data['current_image_cats_path'] = create_hierarchical_path(base_url() . 'browse/images/', $cats_uri_rows);
     $this->data['user_gallery'] = $this->browse_model->get_user($gallery->user_id);
     $this->data['gallery'] = $gallery;
     if ($this->ion_auth->logged_in()) {
         $logged_in_user = $this->ion_auth->user()->row();
         $this->data['logged_in_user'] = $logged_in_user;
         $this->data['object_rated'] = $this->evaluations_model->rated_gallery($gallery->id, $logged_in_user->id);
     }
     $this->data['thumb_mini_config'] = $this->config->item('thumb_mini', 'digallery');
     $this->data['thumb_preview_config'] = $this->config->item('thumb_preview', 'digallery');
     $this->data['avatars_config'] = $this->config->item('avatar', 'digallery');
     $this->data['name_of_ratings'] = $this->config->item('name_of_ratings', 'digallery');
     $this->data['js'][] = 'comments.js';
     $this->data['js'][] = 'jquery.jcarousel.min.0.2.8.js';
     //$this->data['js'][] = 'jquery.jcarousel.min.0.3.0.js';
     $this->data['js'][] = 'gallery_view.js';
     $this->render();
 }
 public function comments($user_id = 0, $comments_type = 'all', $current_page = 1)
 {
     $this->load->helper('browse');
     $this->load->library('typography');
     $this->load->helper('urllinker');
     $this->load->model('comments_model');
     $user = $this->browse_model->get_user(intval($user_id));
     if ($user === FALSE || !$user->active) {
         show_error("Użytkownik nie istnieje...", 404, 'Błąd!');
     }
     if ($comments_type == 'all') {
         $page_segment = 4;
     } else {
         $page_segment = 5;
     }
     if ($current_page == 0) {
         $current_page = 1;
     }
     $all_comments = $this->comments_model->counts_user_comments($user_id, $comments_type);
     if ($all_comments > 0) {
         $last_page = ceil($all_comments / $this->profile_comments_config['page_size']);
         if ($current_page > $last_page) {
             $current_page = $last_page;
         }
         $user_comments = $this->comments_model->get_user_comments($user_id, $current_page, $this->profile_comments_config['page_size'], $comments_type);
         foreach ($user_comments as &$user_comment) {
             $user_comment->comment = $this->typography->auto_typography(htmlEscapeAndLinkUrls($user_comment->comment), TRUE);
         }
         $this->data['object_comments'] = $user_comments;
         $this->data['pagination_links'] = $this->pagination_links("/profile/{$user_id}/comments/" . ($comments_type !== 'all' ? $comments_type . '/' : ''), $this->profile_comments_config['page_size'], $all_comments, $page_segment);
     } else {
         $this->data['object_comments'] = array();
     }
     $this->data['user'] = $user;
     if ($this->ion_auth->logged_in()) {
         $this->data['logged_in_user'] = $this->ion_auth->user()->row();
     }
     $this->data['avatars_config'] = $this->config->item('avatar', 'digallery');
     $this->render();
 }
 public function edit_comment($comment_id)
 {
     if ($this->input->is_ajax_request()) {
         $comment_id = intval($comment_id);
         if ($this->ion_auth->logged_in()) {
             $old_comment = $this->comments_model->get_comment($comment_id);
             if ($old_comment === FALSE) {
                 $this->output->set_status_header('500');
                 return;
             }
             $logged_in_user = $this->ion_auth->user()->row();
             if ($logged_in_user->id === $old_comment->user_id) {
                 if ($this->input->post('comment') && $this->input->post('comment') != '') {
                     if ($old_comment->comment !== $this->input->post('comment')) {
                         if ($this->comments_model->update_comment($comment_id, $this->input->post('comment'))) {
                             $updated_comment = $this->comments_model->get_comment($comment_id);
                             $typography_comment = $this->typography->auto_typography(htmlEscapeAndLinkUrls($updated_comment->comment), TRUE);
                             //$typography_comment = nl2br($this->typography->format_characters(htmlEscapeAndLinkUrls($updated_comment->comment)));
                             $this->output->set_content_type('application/json')->set_output(json_encode(array("status" => 1, "comment" => $typography_comment, "last_edit" => $updated_comment->last_edit)));
                         } else {
                             $this->output->set_content_type('application/json')->set_output(json_encode(array("status" => 0)));
                         }
                     }
                 }
             }
         } else {
             $this->output->set_status_header('401');
         }
     }
 }
 public function preview($image_id = 0, $name = '')
 {
     $this->load->model('browse_model');
     $this->load->model('comments_model');
     $this->load->model('evaluations_model');
     $this->load->library('typography');
     $this->load->helper(array('browse', 'urllinker', 'urlslug'));
     if (($image = $this->browse_model->get_image(intval($image_id))) === FALSE) {
         show_error("Praca nie występuje...", 404, 'Błąd!');
     }
     if (($current_page = $this->current_page(4)) === FALSE) {
         show_error("Strona nie występuje...", 404, 'Błąd!');
     }
     $this->data['adult_user'] = $this->adult_user;
     $this->data['previous_image_id_name'] = $this->browse_model->get_user_prev_image_id_name($image->user_id, $image->id);
     $this->data['next_image_id_name'] = $this->browse_model->get_user_next_image_id_name($image->user_id, $image->id);
     $all_image_comments = $this->comments_model->counts_image_comments($image_id);
     if ($all_image_comments > 0) {
         $last_page = ceil($all_image_comments / $this->image_comments_config['page_size']);
         if ($current_page > $last_page) {
             $current_page = $last_page;
         }
         $image_comments = $this->comments_model->get_image_comments($image_id, $this->image_comments_config['page_size'], $current_page);
         foreach ($image_comments as &$image_comment) {
             $image_comment->comment = $this->typography->auto_typography(htmlEscapeAndLinkUrls($image_comment->comment), TRUE);
             $image_comment->signature = $this->typography->auto_typography(htmlEscapeAndLinkUrls($image_comment->signature), TRUE);
         }
         $this->data['object_comments'] = $image_comments;
         $this->data['pagination_links'] = $this->pagination_links("/image/preview/{$image_id}/", $this->image_comments_config['page_size'], $all_image_comments, 4);
     } else {
         $this->data['object_comments'] = array();
     }
     $this->data['can_comment'] = $image->can_comment;
     $this->data['comment_object_owner'] = $image->user_id;
     $this->data['can_evaluate'] = $image->can_evaluated;
     $cats_uri_rows = $this->browse_model->get_cats_uri_rows($this->browse_model->build_path_cats($image->category_id, 'images'), 'images');
     $cats_path = create_hierarchical_path(base_url() . 'browse/images/', $cats_uri_rows);
     $user_image = $this->browse_model->get_user($image->user_id);
     $this->data['number_views'] = $this->browse_model->counts_views($image->id);
     $this->data['number_views_today'] = $this->browse_model->counts_views_today($image->id);
     $this->increment_views($image->id);
     $this->data['number_downloads'] = $this->browse_model->counts_downloads($image->id);
     $this->data['number_downloads_today'] = $this->browse_model->counts_downloads_today($image->id);
     //$this->browse_model->increment_downloads($image->id);
     $this->data['user_image'] = $user_image;
     $this->data['thumbs_mini'] = $this->browse_model->get_thumb_images(0, 0, 'dd', $image->user_id, 1, 8);
     $this->data['preview_image'] = $image;
     $this->data['cats_path'] = $cats_path;
     $this->data['number_favs'] = $this->browse_model->counts_favorites($image->id);
     $this->data['number_favs_today'] = $this->browse_model->counts_favorites_today($image->id);
     if ($this->ion_auth->logged_in()) {
         $logged_in_user = $this->ion_auth->user()->row();
         $this->data['logged_in_user'] = $logged_in_user;
         $this->data['image_added_to_favs'] = $this->browse_model->added_to_favorites($image_id, $logged_in_user->id);
         $this->data['object_rated'] = $this->evaluations_model->rated_image($image->id, $logged_in_user->id);
     }
     $this->data['thumb_mini_config'] = $this->config->item('thumb_mini', 'digallery');
     $this->data['thumb_preview_config'] = $this->config->item('thumb_preview', 'digallery');
     $this->data['avatars_config'] = $this->config->item('avatar', 'digallery');
     if ($image->plus_18 && !$this->adult_user && !(isset($logged_in_user) && $logged_in_user->id === $image->user_id)) {
         $this->data['adult_filter'] = TRUE;
     } else {
         $this->data['adult_filter'] = FALSE;
     }
     $this->data['js'][] = 'comments.js';
     $this->data['js'][] = 'preview.js';
     $this->data['name_of_ratings'] = $this->config->item('name_of_ratings', 'digallery');
     $this->render();
 }
 /**
  * @param string $text
  * @return string
  */
 protected function linkify($text)
 {
     return htmlEscapeAndLinkUrls($text);
 }
 public function show_post_in($post_id = 0)
 {
     $this->load->library('typography');
     $this->load->helper('urllinker');
     if ($this->ion_auth->logged_in()) {
         $user = $this->ion_auth->user()->row();
         if (($post = $this->posts_model->get_post('inbox', $post_id, $user->id)) === FALSE) {
             $this->session->set_flashdata(array('type' => 'error', 'msg' => 'Wiadomość nie istnieje lub nie jesteś jej adresatem...'));
             redirect('posts/inbox', 'refresh');
         }
         $user_to = $this->ion_auth->user($post->user_id_from)->row();
         if (empty($user_to)) {
             //@todo
             // Zastanowic sie co robic gdy user nie wystepuje już w bazie? Moze jakis statyczny ANONIM.
             // Pamiętać należy by wyłączyć możliwość odpowiedzi do takiego użytkownika...
             $this->session->set_flashdata(array('type' => 'error', 'msg' => 'Adresat nie istnieje...'));
             redirect('posts/inbox', 'refresh');
         }
         $this->form_validation->set_error_delimiters('', '');
         $this->form_validation->set_rules('subject', 'Tytuł', 'required|xss_clean');
         $this->form_validation->set_rules('post_message', 'Wiadomość', 'required|xss_clean');
         if ($this->form_validation->run() == TRUE) {
             if ($this->posts_model->send_post($user->id, $user_to->id, $this->input->post('subject'), date('Y-m-d H:i:s'), $this->input->post('post_message'))) {
                 $this->session->set_flashdata(array('type' => 'info', 'msg' => 'Wiadomość została wysłana...'));
                 redirect('posts/inbox/', 'refresh');
             } else {
                 $this->session->set_flashdata(array('type' => 'error', 'msg' => 'Nie udało się wysłać wiadomości...'));
                 redirect('posts/inbox/', 'refresh');
             }
         } else {
             $this->data['message'] = array('type' => $this->session->flashdata('type'), 'msg' => $this->session->flashdata('msg'));
             $this->data['form_attr'] = array('id' => 'posts-message-inbox', 'class' => 'form-horizontal');
             $this->data['subject'] = array('name' => 'subject', 'id' => 'subject', 'class' => 'span7', 'type' => 'text', 'value' => $this->form_validation->set_value('subject', '[RE]: ' . $post->subject));
             $this->data['subject_label'] = array('for' => 'subject', 'text' => 'Temat:', 'attributes' => array('class' => 'control-label'));
             $this->data['post_message'] = array('name' => 'post_message', 'id' => 'post_message', 'class' => 'span7', 'rows' => '6', 'value' => $this->form_validation->set_value('post_message'));
             $this->data['post_label'] = array('for' => 'post', 'text' => 'Treść wiadomości:', 'attributes' => array('class' => 'control-label'));
             $this->data['del_post_form_attr'] = array('id' => 'posts-message-inbox-delete');
             // hidden input
             $this->data['hidden_post_id'] = array('posts[]' => $post->id);
             $this->data['control_groups'] = array('subject' => form_error('subject') ? ' error' : '', 'post_message' => form_error('post_message') ? ' error' : '');
             $post->message = $this->typography->auto_typography(htmlEscapeAndLinkUrls($post->message), TRUE);
             $this->data['post'] = $post;
             $this->data['user_from'] = $user_to;
             $this->data['js'] = 'show_post_in.js';
             $this->render();
         }
     } else {
         redirect('user/login');
     }
 }
Here's the answer: http://www.google.com/search?rls=en&q=42&ie=utf-8&oe=utf-8&hl=en. What was the question?
A quick look at 'http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax' is helpful.
There is no place like 127.0.0.1! Except maybe http://news.bbc.co.uk/1/hi/england/surrey/8168892.stm?
Ports: 192.168.0.1:8080, https://example.net:1234/.
Beware of Greeks bringing internationalized top-level domains (xn--hxajbheg2az3al.xn--jxalpdlp).
10.000.000.000 is not an IP-address. Nor is this.a.domain.

<script>alert('Remember kids: Say no to XSS-attacks! Always HTML escape untrusted input!');</script>

https://mail.google.com/mail/u/0/#starred?compose=141d598cd6e13025
https://www.google.com/search?q=bla%20bla%20bla
https://www.google.com/search?q=bla+bla+bla

We need to support IDNs and IRIs and röck döts:
møøse.kwi.dk/阿驼鹿一旦咬了我的妹妹/من-اليمين-إلى-اليسار-لغات-تخلط-لي.
EOD;
print nl2br(htmlEscapeAndLinkUrls($text));
?>
</p>
<!-- HTML input -->
<?php 
$html = <<<EOD
<p>Send me an <a href="*****@*****.**">e-mail</a> at bob@example.com.</p>
<p>This is already a link: <a href="http://google.com">http://google.com</a></p>
<p title='10>20'>Tricky markup...</p>
EOD;
print linkUrlsInTrustedHtml($html);
?>
</body>
</html>