You could retrieve URLs using regular expressions, here two examples on how to create <a>
tags from found URLs and on how to shorten content of <a>
tags:
<?php
$orig_text = <<<TEXT
This is some text. http://www.example.com/this-is-a-quite-long-url-to-be-shortened.html
http://www.example.com/another-url-to-be-shortened and http://www.example.com/another-one-that-is-longer-than-limit then
http://www.example.com/an-ok-url and some text to finish the sentence.
Now, try with an HTTPS url: https://www.example.com/this-https-url-is-too-long.
And with an already-created tag <a href='http://www2.example.com/this-is-another-long-url.html'>http://www2.example.com/this-is-another-long-url.html</a> <a href='http://www2.example.com/my-test-url-goes-here.html'>And this is just some long long link description to be shortened</a>. More text here.
TEXT;
$PATTERN_URL='#(?:href=[\'"]?)?!(https?://([^/]+)/([^\s]+))\b#';
define('URL_LENGTH_LIMIT', 36);
function create_a_tag($matches) {
$url = $matches[1];
$label = $matches[1];
if (strlen($label) > URL_LENGTH_LIMIT) $label = $matches[2] . '/...';
return "<a href='$url'>$label</a>";
}
function shorten_url_or_text($url) {
if (strlen($url) > URL_LENGTH_LIMIT) {
$matches = array();
if (preg_match('#^(https?://[^/]*).*#', $url, $matches)) {
// Shorten as for URLS
return $matches[1] . '/...';
}
else {
// Trim to a given length
return substr($url, 0, URL_LENGTH_LIMIT-3) . '...';
}
}
else {
return $url;
}
}
function shorten_a_text($matches) {
$text = shorten_url_or_text($matches[2]);
return $matches[1] . $text . $matches[3];
}
// This will replace urls with their shortened form
echo "----- CREATE <A> TAGS -----\n";
$text2 = preg_replace_callback($PATTERN_URL, 'create_a_tag', $orig_text);
echo $text2 . "\n";
// This will shorten content inside <a> tags
echo "----- CREATE <A> TAGS -----\n";
$text3 = preg_replace_callback('@(<a[^>]*>)([^<]*)(</a>)@i', 'shorten_a_text', $text2);
echo $text3;
echo "\n";