Поддержка «автоматических ссылок»
Суть проблемы: Имеется скрипт блога. Все работает замечательно. Но... не хватает поддержки автоматических гиперссылок.
Как в php сделать чтобы строки вида «http://адрес», «www.адрес» и «ящик@домен» автоматически конвертировались в соответствующие гиперссылки? |
руками блин! Как же еще?!
preg_replace() десу!!! |
спасибо за исчерпывающий ответ :)
|
типа вот такого?
<?php $pattern = "/(http:\/\/([\w\d_\-]+)\.([\w\d_\-]+)\.(ru|net|com|org|biz|info))/i"; $to = "<a href=\"$1\">$1</a>"; $text = "А это тот самый сайт [http://www.my_site-domain23.com], о котором мы разговаривали вчера."; echo HtmlSpecialChars($text)."<br>"; $text = preg_replace($pattern,$to,$text); echo HtmlSpecialChars($text); // [<a href="http://www.my_site-domain23.com">http://www.my_site-domain23.com</a>] ?> |
ну, если работает, то да))
теперь немного критики: из шаблона можно убрать внешние круглые скобки и в строке замены обращатся уже к $0 вместо $1 также стоит учесть что что адрес сайта может быть без поддомена( например http://ya.ru), либо с произвольным их количеством, и в любой зоне для неисспользуемых подшаблонов можно задать ?: указав тем самым, что запоминать их не надо. да и подшаблоны у вас используются там, где и без них можно $pattern = "/http:\/\/(?:[\w\d_\-]+\.)+[\w\d_]{2,5}/i"; $to = "<a href=\"$0\">$0</a>"; $text = "А это тот самый сайт [http://my_site-domain23.edu], о котором мы разговаривали вчера."; вообще же довольно замечательно для первого регулярного выражения, если вы сами его составили |
конечно не сама. Гугл помог :) теперь осталось додуматься как это совместить с основным кодом, то есть куда вставить
<?php if($username) { $action = $_GET['action']; if($action == "go") { function utf8_substr($str, $from, $len) { return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s', '$1', $str); } $title = $_POST['title']; $descr = $_POST['descr']; $theme = $_POST['theme']; $trans = $_POST['trans']; if(!$title) { $ERROR = "Введите заголовок"; } elseif(!$descr) { $ERROR = "Введите текст сообщения"; } elseif(!$username) { $ERROR = "Вы не авторизированы!"; } elseif(!$theme) { $ERROR = "Выберите тему"; } elseif(strlen($title) > 50) { $ERROR = "В заголовке должно быть не более 25-ти символов"; } elseif(strlen($descr) > 6000) { $ERROR = "Текст сообщения содержит слишком много символов (не более 3000)"; } else { if($trans == 1) { include "functions.php"; $title = translit($title); $descr = translit($descr); } $title = htmlspecialchars(stripslashes($title)); $title = str_replace("'","",$title); $descr = htmlspecialchars(stripslashes($descr)); $descr = str_replace("'","",$descr); $date = date("d.m.Y H:i:s"); $stxt = utf8_substr($descr,0,50); $time = time(); $sql = mysql_query("INSERT INTO users_blogs (user, title, date, theme, text, time) VALUES ('$username', '$title', '$date', '$theme', '$stxt', $time)"); $id = mysql_insert_id(); $sql = mysql_query("INSERT INTO message (blog_id, msg, user, date) VALUES ('$id', '$descr', '$username', '$date')"); $YES = "Ваш блог создан!"; include "posts.php"; } } if(!$YES) { include "design/".$dir."/add_blog.tpl"; } } else { print "Время сессии истекло!"; } ?> |
а разве непонятно?
это простой, хоть и говнарский код вставляйте в любом месте ранее добавления в SQL-запрос учитывая что используются не-UTF символы, то без разницы PS забыл, что в зависимости от настроек локали \w в регулярке может затрагивать не только латиницу но и национальный алфавит $pattern = "/http:\/\/(?:[a-zA-Z\d_\-]+\.)+[a-zA-Z\d_]{2,5}/i"; |
что-то не получается... наверное из-за того что "говнарский код":D
|
и тем не менее, попробуйте сделать это самостоятельно
если вы не можете сами сделать такое небольшое изменение кода, то это не означает что за вас будут не только разжевывать(что я уже сделал), но и проглатывать-переваривать |
ну да, согласна. буду пробовать методом науного втыка - самым точным методом в мире:)
|
Часовой пояс GMT +3, время: 04:45. |