Пропустить

функция make_clickable

Форум для авторов модов для phpBB 2.0.x.

функция make_clickable

Сообщение wce » 08.01.2008 17:37

просьба сильно не пинать, т.к. регулярные выражения в пхп только начал постигать.

была цель: когда постятся линки в сообщениях на форуме, ссылки на собственный форум превращать в гипертекстовые, а на внешние сайты - оставлять простым текстом. сделал вот так:

function make_clickable($text)
{
	$text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $text);

	// pad it with a space so we can match things at the start of the 1st line.
	$ret = ' ' . $text;

if (preg_match("/forum\.site\.ru/", $ret)) {
	$ret = preg_replace("#(^|[\n ])([\w]+?://([\w]+\.)*site\.ru((/[\w]*)+[\w/\.?=&\#\[\]]*)?)#is", "\\1<a href=\"\\2\" target=\"_self\">\\2</a>", $ret);
	$ret = preg_replace("#(^|[\n ])((www|ftp)\.([\w]+\.)*site\.ru((/[\w]*)+[\w/\.?=&\#\[\]]*)?)#is", "\\1<a href=\"http://\\2\" target=\"_self\">\\2</a>", $ret);
	$ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret);
	$ret = substr($ret, 1);	
	return($ret);
} else {
	return($text);
	}
}


вроде как желаемую цель выполняет. но. если линки обрамлять допустим в какой либо оформительский bb-код:

(b)http://forum.mysite.ru(b)

линк даже на мой сайт остается текстом. если же после (b) и перед (b) вставить пробел:

(b) http://forum.mysite.ru (b)

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

wce
phpBB 1.2.1
 
Сообщения: 20
Зарегистрирован: 10.02.2006 16:50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Сообщение Alek$ » 08.01.2008 20:33

wce
на сколько я разобрался, ваш код концептуально неправилен. Он преобразует все ссылки в гипертекстовые, если в посте есть фраза "forum.site.ru".
чтобы реализовать вашу идею, надо либо переписать функцию полностью, либо править реглулярки, отвечающие за замену.
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.
Аватара пользователя
Alek$
Лидер модераторов
Лидер модераторов
 
Сообщения: 2653
Зарегистрирован: 03.08.2005 13:46
Откуда: Новосибирск
Благодарил (а): 3 раз.
Поблагодарили: 45 раз.

Сообщение wce » 09.01.2008 10:53

Alek$
ну я ж написал

была цель: когда постятся линки в сообщениях на форуме, ссылки на собственный форум превращать в гипертекстовые, а на внешние сайты - оставлять простым текстом.


если в посте есть ссылки на мой форум - значит ссылки на мой форум преобразовываются в гипертекст. если нету - значит все оставляем текстом.

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

wce
phpBB 1.2.1
 
Сообщения: 20
Зарегистрирован: 10.02.2006 16:50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Сообщение Alek$ » 09.01.2008 11:13

wce
Извиняюсь, с вечера невнимательно посмотрел код.

Все же непонятно зачем нужно это условие:
if (preg_match("/forum\.site\.ru/", $ret)) { 

сли вы регулярках добавили site.ru, то зачем делать еще одну проверку?

Что касается сабжа, то и обычные ссылки не преобразуются, если их окружить ббкодом без пробела: http://qweqweqwe.ru

Для фикса попробуйте начало каждой региулярки:
(^|[\n ])

заменить на
(^|[\n ]|[>\]])
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.
Аватара пользователя
Alek$
Лидер модераторов
Лидер модераторов
 
Сообщения: 2653
Зарегистрирован: 03.08.2005 13:46
Откуда: Новосибирск
Благодарил (а): 3 раз.
Поблагодарили: 45 раз.

Сообщение wce » 09.01.2008 13:27

Alek$
поправил как Вы предложили, обработка ссылок оформленных в бб-теги теперь проходит нормально. и пересмотрел логику по вашему совету, действительно зачем я еще проверял с помощью preg_match, в регулярках же и так ссылками станут только линки на мой форум... :)

вот как выглядит сейчас функция:

function make_clickable($text) {
	$text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $text);

	// pad it with a space so we can match things at the start of the 1st line.
	$ret = ' ' . $text;

	$ret = preg_replace("#(^|[\n ]|[>\]])([\w]+?://([\w]+\.)*site\.ru((/[\w]*)+[\w/\.?=&\#\[\]]*)?)#is", "\\1<a href=\"\\2\" target=\"_self\">\\2</a>", $ret);
	$ret = preg_replace("#(^|[\n ]|[>\]])((www|ftp)\.([\w]+\.)*site\.ru((/[\w]*)+[\w/\.?=&\#\[\]]*)?)#is", "\\1<a href=\"http://\\2\" target=\"_self\">\\2</a>", $ret);
	$ret = preg_replace("#(^|[\n ]|[>\]])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret);
	$ret = substr($ret, 1);	
	return($ret);
}


Alek$ еще раз спасибо за совет по улучшению :)

wce
phpBB 1.2.1
 
Сообщения: 20
Зарегистрирован: 10.02.2006 16:50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Сообщение Alek$ » 09.01.2008 14:11

wce
пожалуйста :)
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.
Аватара пользователя
Alek$
Лидер модераторов
Лидер модераторов
 
Сообщения: 2653
Зарегистрирован: 03.08.2005 13:46
Откуда: Новосибирск
Благодарил (а): 3 раз.
Поблагодарили: 45 раз.


Вернуться в Для авторов (phpBB 2.0.x)

 

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Бессрочный конкурс phpBB-ориентированных материалов
FastVPS — надёжный и доступный хостинг для phpBB
Место для вашей рекламы