ecto.ru

Детали

PHP обработка url в тексте

Обычно формы на сайте это простые текстовы поля, неплохо было бы сделать ссылки ссылками.

Нужно обработать текст пришедший с формы — сделать в нем ссылки ссылками, а в случае открытия документа на редактирования вернуть текст в исходное состояние. Выходит нам как минимум надо 2 функции textFromForm и testToForm.

textFromForm

В тексте ссылка может быть в конце предложения, перед запятой или например в скобках, поэтому некоторые знаки пункцуации в ссылку не должны попасть. Вместе с тем, ссылка бывает очень длинная ее нужно укоротить, желательно минимально потеряв читаемость. Поэтому я разделал входную функцию на две — первая ищет в тексте урлы, вторая (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>'; }

textToForm

Функция для возвращения ссылок обратно в текст гораздо проще, тут мы обходимся обычноой регулярной заменой.

function textToForm($str) { return preg_replace('/<a href="([^"]+)">[^<]+<\/a>/u','\1',$str); }

Приведенный алгоритм с успехом работает на сайте дизайн бюро Артема Горбунова и всех проектах с версией Reactor больше 3.6a.

Comments:

sdf 14.12.2008
asdasd