Mr C
Mr C

Reputation: 145

Hide links in user input

I just can't seem to find an answer to this one; I have a text box in which users can write, and I want to replace their text if they write www.something.com or suchlike. I want to replace it with the text "a website".

The closest I've found so far is an answer round here about turning plain text into links in a similar scinario. I wondered if I could turn around to my task but my php's not great! I just kind of guessed... then got a bit stuck. Any help or a sleeker way to do it much appreciated!

function remove_links {

$validTlds = array_fill_keys(explode(" ", ".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 .xn--0zwm56d .xn--11b5bs3a9aj6g .xn--80akhbyknj4f .xn--9t4b11yi5a .xn--deba0ad .xn--g6w251d .xn--hgbk6aj7f53bba .xn--hlcj6aya9esc7a .xn--jxalpdlp .xn--kgbechtv .xn--zckzah .arpa"), true);

  $position = 0;
  while (preg_match("{\\b$rexProtocol$rexDomain$rexPort$rexPath$rexQuery$rexFragment(?=[?.!,;:\"]?(\s|$))}", $text, &$match, PREG_OFFSET_CAPTURE, $position))
  {
      list($url, $urlPosition) = $match[0];

      // the text leading up to the URL.
      $pre = (htmlspecialchars(substr($text, $position, $urlPosition - $position)));

      $domain = $match[2][0];
      $port   = $match[3][0];
      $path   = $match[4][0];

      // Check if the TLD is valid - or that $domain is an IP address.
      $tld = strtolower(strrchr($domain, '.'));
      if (preg_match('{\.[0-9]{1,3}}', $tld) || isset($validTlds[$tld]))
      {
          // Prepend http:// if no protocol specified
          $completeUrl = $match[1][0] ? $url : "http://$url";

          // ------------ now I'm a bit stuck! How to modify beyond here? ------------------
          printf('<a href="%s">%s</a>', htmlspecialchars($completeUrl), htmlspecialchars("$domain$port$path"));
      }
      else
      {
          // Not a valid URL.
          print(htmlspecialchars($url));
      }

      // Continue text parsing from after the URL.
      $position = $urlPosition + strlen($url);
  }

  // Print the remainder of the text.
  print(htmlspecialchars(substr($text, $position)));

}

Upvotes: 0

Views: 89

Answers (1)

Joseph
Joseph

Reputation: 5160

Why not use filter_var() with FILTER_VALIDATE_URL (manual)?

<?php

$url = 'http://google.com';
//$url = 'invalid url www.google.com';

if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo '<a href="'.$url.'">Link</a>';
} else {
    echo 'Not a url.';
}

Upvotes: 2

Related Questions