<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PhpFiddle Initial Code</title>
</head>

<body>
<?php
function shortenMessage($message,$limit=140,$encoding='utf-8') {
    if (
mb_strlen($message,$encoding) <= $limit) return $message;
    echo 
'<pre><h3>Original message:<br />'.$message.'<hr>';
    
# search positions of links
    
$reg_exUrl "/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
    
preg_match_all ($reg_exUrl$message$links,PREG_OFFSET_CAPTURE);
    echo 
'Links found:<br />';
    
var_dump($links[0]);
    echo 
'<hr>';
    
$position = array();
    
$len 0;
    
# search utf-8 position of links
    
foreach ($links[0] as $values) {
       
$url $values[0];
       
$offset $values[1];
       
#$pos = mb_strpos($message, $url, $offset, $encoding); # doesnt work
       
$pos mb_strpos($message$url0$encoding);
       
$position[$pos] = $url;
       
# delete url from string
       
$message str_replace($url''$message);
       
$len += mb_strlen($url,$encoding); # sum lenght of urls to cut from maxlenght
    
}
    echo 
'UTF-8 Positions:<br />';
    
var_dump($position);
    echo 
'<hr>';
    
# shorten text
    
$maxlenght $limit $len 7# 7 is a security buffer
    
while ($maxlenght 0) { # too many urls? then cut some...
       
array_shift($position);
       
$len -= mb_strlen($position[0],$encoding);
       
$maxlenght $limit $len 6;
    }
    echo 
'UTF-8 Positions shortened:<br />';    
    
var_dump($position);
    echo 
'<hr>';
    
$message mb_substr($message,0,$maxlenght,$encoding).'... ';
    echo 
'Shortened message without urls:<br />';    
    
var_dump($message);
    echo 
'<hr>';
    
# re-insert urls at right positions
    
$addpos 0;
    foreach (
$position as $pos => $url) {
        
$pos += $addpos;
        if (
$pos mb_strlen($message,$encoding)) {
            
$message mb_substr($message,0,$pos,$encoding).$url.mb_substr($message,$pos,mb_strlen($message),$encoding);
        } else {
            
$message .= ' '.$url;
        }
        
$addpos += mb_strlen($url,$encoding);
    }
    echo 
'Shortened message:<br />';
    
var_dump($message); 
    echo 
'<hr>';
    return 
$message;
}
if (isset(
$_POST['msg'])) shortenMessage($_POST['msg']);
?>
    <h2>Insert text to shorten here:</h2>
<form action="" method="post">
<textarea name="msg"></textarea>
<input type="submit"/>
</form>
    <hr>
    <h2>
        Text examples (first works - second doesn't - because of similar urls)
    </h2>
    Lorem ipsum dolor sit amet: http://bit.ly/111111 Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. http://bit.ly/222222 Sed diam voluptua. At vero eos et accusam et justo duo dolores. http://bit.ly/333333
    <hr>
    Lorem ipsum dolor sit amet: http://bit.ly/111111 Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. http://bit.ly/222222 Sed diam voluptua. At vero eos et accusam et justo duo dolores. http://bit.ly/222222
</body>
</html>