Замена урлов на ссылки везде КРОМЕ внутри textarea

Greendrake

Новичок
Замена урлов на ссылки везде КРОМЕ внутри textarea

Сочинил регулярное выражение для замены урлов на ссылки:

preg_replace('/([^"\'])(http:\/\/[\.\w-\/\?&=;]+)([^\w-])/','$1<a href="$2">$2</a>$3',$str)

только вот проблема - когда на странице вызывается редактирование текстового блока, изначально содержащего урлы без ссылок, в textarea вставляется, естественно, со ссылками. Как можно этого избежать? Помогите изменить рег. выр. так, чтобы ВНУТРИ textarea замены не было.
Спасибо.
 

Фанат

oncle terrible
Команда форума
а ты что - этим регом обрабатываешь просто весь выходной поток, что ли?
 

Greendrake

Новичок
да, именно.
я не могу обрабатывать куски по отдельности, поскольку они формируются в виде XML, который потом целиком рендерится XSLT-шаблоном. А он заменит все сущности внутри текстовых блоков на их escape-представления, т. е. вместо < будет &lt; и т. п....
Думаю, что мощь регулярных выражений запросто позволит справиться с озвученной задачей, только я в них не ас пока...
 

Necromant

Новичок
PHP:
$str  = preg_replace_callback('/<textarea>([^"\'])(http:\/\/[\.\w-\/\?&=;]+)([^\w-])<\/textarea>/si',conv_textarea , $str);


$str = preg_replace('/([^"\'])(http:\/\/[\.\w-\/\?&=;]+)([^\w-])/','$1<a href="$2">$2</a>$3',$str);


$str = preg_replace('/([^"\'])(textarea:\/\/[\.\w-\/\?&=;]+)([^\w-])/','$1 $2 $3',$str);


function conv_textarea($match) {
   retrurn $match[1].str_replace("http://", "textarea://", $match[2]).$match[3];
}
где-то так =)
 

Greendrake

Новичок
Что-то не пашет.

Пришёл пока вот к такому решению:

PHP:
preg_match_all("/<textarea.+<\/textarea>/s",$str,$out); 
$str=preg_split("/<textarea.+<\/textarea>/s",$str);
foreach($str as $key => $s)
{
  $outPut.=preg_replace('/([^"\'])(http:\/\/[\.\w-\/\?&=;]+)([^\w-])/','$1<a href="$2">$2</a>$3',$s).$out[0][$key];
};
echo $outPut;
Но, всё-таки, думаю, есть более изящное решение в виде одного рега.
 
Сверху