функция 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.0
 
Сообщения: 15
Зарегистрирован: 10.02.2006 16:50

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

wce
на сколько я разобрался, ваш код концептуально неправилен. Он преобразует все ссылки в гипертекстовые, если в посте есть фраза "forum.site.ru".
чтобы реализовать вашу идею, надо либо переписать функцию полностью, либо править реглулярки, отвечающие за замену.
Useful links: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.


Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
phpBB 3.0.2 с предустановленной русификацией
Аватара пользователя
Alek$
Модератор
Модератор
 
Сообщения: 1532
Зарегистрирован: 03.08.2005 13:46
Откуда: Новосибирск

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

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

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


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

предложите свою логику задачи? я попросил указать где я ошибся в текушем коде, дабы исправть вышеописанную ситуацию, когда ссылка на мой форум заключается в какие-либо bb-теги.
wce
phpBB 1.2.0
 
Сообщения: 15
Зарегистрирован: 10.02.2006 16:50

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

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

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

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

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

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

заменить на
Код: Выделить всё
(^|[\n ]|[>\]])
Useful links: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.


Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
phpBB 3.0.2 с предустановленной русификацией
Аватара пользователя
Alek$
Модератор
Модератор
 
Сообщения: 1532
Зарегистрирован: 03.08.2005 13:46
Откуда: Новосибирск

Сообщение 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.0
 
Сообщения: 15
Зарегистрирован: 10.02.2006 16:50

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

wce
пожалуйста :)
Useful links: phpBB2 и phpBB3 FAQ; Правила общения;
Все консультации в icq или личке - на платной основе.


Самая страшная ошибка, это ошибка без видимых причин и конкретных последствий.
phpBB3 [db_update.php generator]
phpBB 3.0.2 с предустановленной русификацией
Аватара пользователя
Alek$
Модератор
Модератор
 
Сообщения: 1532
Зарегистрирован: 03.08.2005 13:46
Откуда: Новосибирск


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

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

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