Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

функция make_clickable

Форум для авторов модов для phpBB 2.0.x.
wce
phpBB 1.2.1
Сообщения: 20
Стаж: 18 лет 2 месяца

функция make_clickable

Сообщение wce »

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

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

Код: Выделить всё

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)

все начинается работать как и задумано было. ткните где напортачил?
Аватара пользователя
Alek$
Former team member
Сообщения: 2616
Стаж: 18 лет 8 месяцев
Откуда: Новосибирск
Поблагодарили: 3 раза

Сообщение Alek$ »

wce
на сколько я разобрался, ваш код концептуально неправилен. Он преобразует все ссылки в гипертекстовые, если в посте есть фраза "forum.site.ru".
чтобы реализовать вашу идею, надо либо переписать функцию полностью, либо править реглулярки, отвечающие за замену.
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.
wce
phpBB 1.2.1
Сообщения: 20
Стаж: 18 лет 2 месяца

Сообщение wce »

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

предложите свою логику задачи? я попросил указать где я ошибся в текушем коде, дабы исправть вышеописанную ситуацию, когда ссылка на мой форум заключается в какие-либо bb-теги.
Аватара пользователя
Alek$
Former team member
Сообщения: 2616
Стаж: 18 лет 8 месяцев
Откуда: Новосибирск
Поблагодарили: 3 раза

Сообщение Alek$ »

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 или личке - на платной основе.
wce
phpBB 1.2.1
Сообщения: 20
Стаж: 18 лет 2 месяца

Сообщение wce »

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$ еще раз спасибо за совет по улучшению :)
Аватара пользователя
Alek$
Former team member
Сообщения: 2616
Стаж: 18 лет 8 месяцев
Откуда: Новосибирск
Поблагодарили: 3 раза

Сообщение Alek$ »

wce
пожалуйста :)
Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
Первая помощь по всем phpBB-вопросам: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.

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