Обычно формы на сайте это простые текстовы поля, неплохо было бы сделать ссылки ссылками.
Нужно обработать текст пришедший с формы — сделать в нем ссылки ссылками, а в случае открытия документа на редактирования вернуть текст в исходное состояние. Выходит нам как минимум надо 2 функции textFromForm и testToForm.
В тексте ссылка может быть в конце предложения, перед запятой или например в скобках, поэтому некоторые знаки пункцуации в ссылку не должны попасть. Вместе с тем, ссылка бывает очень длинная ее нужно укоротить, желательно минимально потеряв читаемость. Поэтому я разделал входную функцию на две — первая ищет в тексте урлы, вторая (text_url_handler) деликатно заменяетт их ссылками.
function textFromForm($str)
{
return trim(
preg_replace_callback('/(http:\/\/[^\s<]+[^\s\.,\!\?:;)<\]])/u',
'text_url_handler',' '.$str.' ')
);
}
Алгоритм замены: Если ссылка длинее 70 символов, ее нужно аккуратно обрезать. Мы набирает текст ссылки по слешам с конца до тех пор, пока не получаемая строка короче 60 символов. Алгоритм с упреждением, тоесть сначала примеряем новый кусок и если строка не выходит за границы 60, то пришиваем его, иначе обрезаем.
function text_url_handler($m)
{
$url=$m[1];
$name=$url;
if(strlen($name)>70)
{
$t=strpos($name,'/',8)+1;
if($t===false)$t=50;
$rest=substr($name,$t);
$name=substr($name,0,$t).'...';
if(preg_match_all('/[^a-zA-Z0-9]+[a-zA-Z0-9]+/u',$rest,$rest_a))
{
$rest_a=array_reverse($rest_a[0]);
$rest_str=array();
$restr_cnt=0;
foreach($rest_a as $item)
{
$t=strlen($item);
if($restr_cnt+$t>60)
{
if($restr_cnt<15)
$rest_str[]=substr($item,$restr_cnt-60);
break;
}
$restr_cnt+=$t;
$rest_str[]=$item;
}
$name.=implode('',array_reverse($rest_str));
}
else
{
$name.=substr($rest,$t-70);
}
}
return '<a href="'.$url.'">'.$name.'</a>';
}
Функция для возвращения ссылок обратно в текст гораздо проще, тут мы обходимся обычноой регулярной заменой.
function textToForm($str)
{
return preg_replace('/<a href="([^"]+)">[^<]+<\/a>/u','\1',$str);
}
Приведенный алгоритм с успехом работает на сайте дизайн бюро Артема Горбунова и всех проектах с версией Reactor больше 3.6a.
Comments: