AndyB Posted August 29, 2006 Share Posted August 29, 2006 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. Quote Link to comment Share on other sites More sharing options...
effigy Posted August 30, 2006 Share Posted August 30, 2006 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] Quote Link to comment Share on other sites More sharing options...
AndyB Posted August 30, 2006 Author Share Posted August 30, 2006 ;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). Quote Link to comment Share on other sites More sharing options...
effigy Posted August 30, 2006 Share Posted August 30, 2006 [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] Quote Link to comment Share on other sites More sharing options...
AndyB Posted August 30, 2006 Author Share Posted August 30, 2006 Thank you. That's amazing. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.