На распутье (Регулярные выражения)

Zh0rzh

Новичок
На распутье (Регулярные выражения)

Товарисчи помогите... пишу функцию которая одновременно заменяет в тексте и урлы и емайлы на их хтмл-эквиваленты
PHP:
function url($text)
{
$text =  eregi_replace("([[:alnum:]-]+@[[:alnum:]]+[[:alnum:]-]*[[:alnum:]]+(\\.[[:alnum:]]+)+)", "<a href=\"mailto:\\0\">\\0</a>", $text);
$w="[:alnum:]";
    $reg_url= "((https?|ftp|gopher)://)([$w-])+(\\.[$w-]+)*\\.(ru|net|org|com|name|biz|ua|kz|tv)".
              "(/[$w\\_\\.-]+)*".
              "(/[$w\\_-]+\\.[$w]+".
              "(\\?[$w\\_]+=[$w]+([&%][$w\\_]+=[$w]+)*)?)?";
$text = eregi_replace($reg_url, "<a href=\"\\0\">\\0</a>", $text);
return $text;
}
Этот вариант работает без проблем, но ..... он не принимает ссылки вида www.phpclub.net или yandex.ru , то есть обязателен http://.
Если в переменной
PHP:
$reg_url= "((https?|ftp|gopher)://)?
после скобок добавать ? то получается какая то хрень.

Все в кучу и ссылки и емайлы.
Народ помогите советом
 

dvl

Guest
eregi - тормоз
юзай preg_ ,
что нидь вроде
PHP:
$pat = array(
'/(((http|https|ftp)://)?(www)?(.+))/i',
'/your_mail_reg/i'
);

$repl = array(
'<a href="\1">\5</a>'
'<a href="mailto:">'
);

$text = preg_replace($pat, $repl, $text);
 

Zh0rzh

Новичок
В общем может как нить запертить в урлах знак - @, но все мои попытки сводились к нулю
 

Silent

Новичок
А почему в урле не может быть знака "@"? И в e-mail еще надо разрешить точку в левой части (и, скорее всего, еще много других символов).
 

R`oo`T

Guest
PHP:
$string="http://www.aport.ru";

function replace ($string)
{
 global $CleanLanguage;
 $string = " ".$string;
 $string = eregi_replace ('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '\\1<a href="http://\\2" target="_blank">\\2</a>', $string);
 $string = eregi_replace ('([[:space:]()[{}])(http://.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '\\1<a href="\\2" target="_blank">\\2</a>', $string);
 $string = eregi_replace ("[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*","<a href=\"mailto:\\0\">\\0</a>", $string);
 $lines = count ($CleanLanguage);
 for($i=0;$i<$lines;$i++)
  {
   list($change1,$change2)=explode("|", $CleanLanguage[$i]);
   $string = eregi_replace("$change1","$change2",$string);
  }
 return trim($string);
}

$string=replace($srting);
C мылом тоже самое.
 

R`oo`T

Guest
Правда тут есть лишка :) Её не бери. А так первые две ругялркы - оно.
 

Zh0rzh

Новичок
Автор оригинала: Silent
А почему в урле не может быть знака "@"? И в e-mail еще надо разрешить точку в левой части (и, скорее всего, еще много других символов).
Не знаю, не знаю ...
Ты сможешь все это реализовать, что бы не путались емайлы с урлами? Помоги тогда. Буду очень рад ...
 

Silent

Новичок
URL начинается с http://. Точка. Все остальное - это не URL (для удобства можно сделать поблажку и считать урлом строки, которые начинаются с "www."). И никаких проблем не предвидится. Там, правда, есть другие проблемы - знаки препинания в URL. Если сразу за URL стоит знак препинания, где его закончить? Включать его в URL или нет? Обычно не стоит включать, иначе сглючит. Но некоторые URL содержат знаки препинания (я не понимаю, зачем люди так делают, но иногда они их используют как разделители для параметров). Или вот такой URL: http://вот.такой,вот(урл)у_меня@phpclub.net/ - вполне работоспособный, броузер переваривает. Вопрос в том, где остановиться, потому что сделать универсальный регэксп нелегко.

http://www.xpoint.ru/faqs/faq36.html - тут есть несколько регэкспов. Можно посмотреть и выбрать наилучший.
 
Сверху