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
https://forums.phpfreaks.com/topic/19073-plain-text-to-clickable-short-url/
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]
;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).

Archived

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

×
×
  • 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.