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

irka07 14.12.2009 09:20

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

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

Gvozd 14.12.2009 09:37

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

irka07 14.12.2009 09:42

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

irka07 14.12.2009 09: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 10: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 10: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 10:57

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

irka07 14.12.2009 11:09

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

Gvozd 14.12.2009 11:14

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

irka07 14.12.2009 11:17

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

Gvozd 14.12.2009 11:20

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

irka07 14.12.2009 14:00

Ну как работает первоначалный код, я, в общих чертах, поняла, но как добавить что-то новое, и главное правильно, что бы заработало - уж не представляю как.
Цели изучения всего языка php нет, с удовольствием бы научилась, но пока не требуется. Есть некоторая необходимость улучшить то, что нашла, переделать под собственные нужды, усовершенствовать.
Понятно что без знания языка - тут не обойтись. И вполне одобряю Ваше стремление направить вопрошающих на путь изучения, но это долго и муторно. А все, или практически все, кто обращается с вопросвми на этом форуме хотели бы получить ОТВЕТ, а не намек (или ссылку) на то, где нужно изучить несколько разделов документации, чтобы среди всего, выудить лишь одну-две строчки описывающие именно то действие, которое необходимо произвести, что бы сделать то или иное.
В любом случае, спасибо за помощь:victory:

Gvozd 14.12.2009 18:40

Цитата:

Сообщение от irka07
хотели бы получить ОТВЕТ

но, увы и ах, я(и не я один) считаю что те кто не хотят платить за результат своим временем, потраченным на изучение предметной области, должен платить деньгами тому, кто уже потратил свое время ранее.
И форум предназначен для того чтобы люди совершенствовались в процессе решения своих проблем

irka07 14.12.2009 20:13

И сколько надо заплатить?

Gvozd 15.12.2009 01:27

вы таки не хотите попробовать сами разобратся?
жаль.
символической пары долларов хватит

irka07 15.12.2009 10:06

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

Kolyaj 15.12.2009 10:36

http://www.google.com/search?q=javas...ient=firefo x
http://yandex.ru/yandsearch?text=jav...3&clid=4 6510


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