Поддержка «автоматических ссылок»
Суть проблемы: Имеется скрипт блога. Все работает замечательно. Но... не хватает поддержки автоматических гиперссылок.
Как в 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, время: 18:44. |