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

  • Автор темы Автор темы Zh0rzh
  • Дата начала Дата начала

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)://)?
после скобок добавать ? то получается какая то хрень.

Все в кучу и ссылки и емайлы.
Народ помогите советом
 
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);
 
В общем может как нить запертить в урлах знак - @, но все мои попытки сводились к нулю
 
А почему в урле не может быть знака "@"? И в e-mail еще надо разрешить точку в левой части (и, скорее всего, еще много других символов).
 
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 мылом тоже самое.
 
Правда тут есть лишка :) Её не бери. А так первые две ругялркы - оно.
 
Автор оригинала: Silent
А почему в урле не может быть знака "@"? И в e-mail еще надо разрешить точку в левой части (и, скорее всего, еще много других символов).
Не знаю, не знаю ...
Ты сможешь все это реализовать, что бы не путались емайлы с урлами? Помоги тогда. Буду очень рад ...
 
URL начинается с http://. Точка. Все остальное - это не URL (для удобства можно сделать поблажку и считать урлом строки, которые начинаются с "www."). И никаких проблем не предвидится. Там, правда, есть другие проблемы - знаки препинания в URL. Если сразу за URL стоит знак препинания, где его закончить? Включать его в URL или нет? Обычно не стоит включать, иначе сглючит. Но некоторые URL содержат знаки препинания (я не понимаю, зачем люди так делают, но иногда они их используют как разделители для параметров). Или вот такой URL: http://вот.такой,вот(урл)у_меня@phpclub.net/ - вполне работоспособный, броузер переваривает. Вопрос в том, где остановиться, потому что сделать универсальный регэксп нелегко.

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