Jump to content

plain text to clickable short URL


AndyB

Recommended Posts

Not as simple as you might think.

I have plain text in a database and want any URL strings to be clickable when displayed.  The URLs in the text can be in the form http://www.mysite.com, http://mysite.com, or www.mysite.com.  The 'trick' is that many of the URLs are extremely long and I need the clickable part of the display to shorten the link to, say, 30 characters max.

[code]<a href='http://mysite.com/wombats/stuff/show_me.php?this=6&that=7&furry=yes'>http://mysite.com/wombats  ....furry=yes'></a>[/code]

I assume some preg wizardy can solve this, hence my post.

edit: these links are all offsite, so getting target='_blank' into the output would be a definite bonus.
Link to comment
Share on other sites

Here's one for starting out. You can expand it by adding .net, .org, etc.

[code]
<pre>
<?php

$tests = array(
'http://www.mysite.com',
'http://mysite.com',
'www.mysite.com',
'http://mysite.com/wombats/stuff/show_me.php?this=6&that=7&furry=yes',
'text without an url',
'url with www.google.com in text',
);

function clickable_short_url ($matches) {
### Entire match.
$url = array_shift($matches);
### Only http:// match, if any.
$http = array_shift($matches);
### Shorten textual part if need be.
$url_text = strlen($url) >= 30 ?
(substr($url, 0, 20) . '...' . substr($url, -10, 10)) :
$url ;
### Add http:// prefix if need be.
if (! $http) {
$url = 'http://' . $url;
}
### Return new url.
return '<a target="_blank" href="' . $url . '">' . $url_text . '</a>';
}

$pattern = '%
(http://)? ### optional http:// prefix
(?(1)|www\.) ### require www. if there is no http://
\S+ ### gobble anything but white space
%x';

foreach ($tests as $test) {
echo preg_replace_callback($pattern, 'clickable_short_url', $test);
echo '<br/>';
}
?>
</pre>
[/code]
Link to comment
Share on other sites

;D - exactly.  Thanks for that.

One micro-quibble. If the text being processed is something like " ... or did I find the solution at phpfreaks.com?" the closing question mark appears as part of the URL and in the link text displayed. I ought to be able to hack and slash my way through the code to fix that (fingers crossed).
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.