Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Поддержка «автоматических ссылок» (https://javascript.ru/forum/server/6671-podderzhka-avtomaticheskikh-ssylok.html)

irka07 14.12.2009 08:20

Поддержка «автоматических ссылок»
 
Суть проблемы: Имеется скрипт блога. Все работает замечательно. Но... не хватает поддержки автоматических гиперссылок.

Как в php сделать чтобы строки вида «http://адрес», «www.адрес» и «ящик@домен» автоматически конвертировались в соответствующие гиперссылки?

Gvozd 14.12.2009 08:37

руками блин! Как же еще?!
preg_replace() десу!!!

irka07 14.12.2009 08:42

спасибо за исчерпывающий ответ :)

irka07 14.12.2009 08:58

типа вот такого?

<?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>] 

?>

Gvozd 14.12.2009 09:21

ну, если работает, то да))

теперь немного критики:
из шаблона можно убрать внешние круглые скобки и в строке замены обращатся уже к $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], о котором мы разговаривали вчера.";

вообще же довольно замечательно для первого регулярного выражения, если вы сами его составили

irka07 14.12.2009 09:48

конечно не сама. Гугл помог :) теперь осталось додуматься как это совместить с основным кодом, то есть куда вставить
<?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 "Время сессии истекло!";
}
?>

Gvozd 14.12.2009 09:57

а разве непонятно?
это простой, хоть и говнарский код
вставляйте в любом месте ранее добавления в SQL-запрос
учитывая что используются не-UTF символы, то без разницы
PS забыл, что в зависимости от настроек локали \w в регулярке может затрагивать не только латиницу но и национальный алфавит
$pattern = "/http:\/\/(?:[a-zA-Z\d_\-]+\.)+[a-zA-Z\d_]{2,5}/i";

irka07 14.12.2009 10:09

что-то не получается... наверное из-за того что "говнарский код":D

Gvozd 14.12.2009 10:14

и тем не менее, попробуйте сделать это самостоятельно
если вы не можете сами сделать такое небольшое изменение кода, то это не означает что за вас будут не только разжевывать(что я уже сделал), но и проглатывать-переваривать

irka07 14.12.2009 10:17

ну да, согласна. буду пробовать методом науного втыка - самым точным методом в мире:)


Часовой пояс GMT +3, время: 05:30.