Jump to content

Archived

This topic is now archived and is closed to further replies.

AndyB

plain text to clickable short URL

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.

Share this post


Link to post
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]

Share this post


Link to post
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).

Share this post


Link to post
Share on other sites
[code]
$pattern = '%
(http://)? ### optional http:// prefix
(?(1)|www\.) ### require www. if there is no http://
\S+ ### gobble anything but white space
(?=\b) ### followed by a word boundary
%x';
[/code]

Share this post


Link to post
Share on other sites

×

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.