Хак functions.php | Ссылка на профиль по символу @

6.13K
.

'~(@(.*))~iu'
->
'~@([^\s]+)~'

.
'~@([^\s]+)~'
Я вроде бы пробовал этот вариант, и он чё-то работал не так, как надо было... В общем да, с этим шаблоном отпадают массивы и сопутствующие пара функций. В итоге код будет пока ещё таким:
* (+/-)
/**
     * Обработка текстов перед выводом на экран
     *
     * @param string $str
     * @param int $br   Параметр обработки переносов строк
     *                     0 - не обрабатывать (по умолчанию)
     *                     1 - обрабатывать
     *                     2 - вместо переносов строки вставляются пробелы
     * @param int $tags Параметр обработки тэгов
     *                     0 - не обрабатывать (по умолчанию)
     *                     1 - обрабатывать
     *                     2 - вырезать тэги
     *
     * @return string
     */
    public static function checkout($str, $br = 0, $tags = 0)
    {
        $str = htmlentities(trim($str), ENT_QUOTES, 'UTF-8');
        if ($br == 1) {
            // Вставляем переносы строк
            $str = nl2br($str);
        } elseif ($br == 2) {
            $str = str_replace("\r\n", ' ', $str);
        }
        if ($tags == 1) {
            $str = bbcode::tags($str);
        } elseif ($tags == 2) {
            $str = bbcode::notags($str);
        }
        return self::linkUser($str);
    }
    
    /**
    * Ссылка на профиль по символу @
    * 
    * @param string $str
    * 
    * @return string
    */
    public static function linkUser($str) {
        $str = preg_replace_callback(
            '~@([^\s]+)~iu',
            function ($a) {
                $us = mysql_fetch_assoc(
                    mysql_query("
                        SELECT `id` FROM `users` 
                        WHERE `name` = '". mysql_real_escape_string($a[1]) ."'
                    ")
                );

                if (!empty($us['id'])) {
                    return '<a href="'. $home .'/users/profile.php?user='. 
                        $us['id'] .'">'. $a[0] .'</a>';
                } else {
                    return $a[0];
                }
            },
            $str
        );
        return $str;
    }
ramzes, благодарю.
.
ramzes

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

.
# ramzes (31.01.2017 / 18:50)
Модификаторы ui ненужны, шаблон не регистрозависимый же
но учти, данный шаблон пропустит все кроме пробела, конца строки
фильтрация обязательна
На счёт регистра - согласен. А вот юникод в никах вполне может использоваться, поэтому "u" должен быть в шаблоне. На счёт фильтрации - там джоновские функции сперва отрабатывают, а потом уже результат передаётся в мой метод.
.

Ты не понял, шаблону все равно, уникод там или еще что, он сьедает все, кроме пробела.
Пофиг, какой регистр

.

Переписал скрипт с учётом всех предпочтений. Если кому-то не нравится @ перед ником, то вы можете задать любой другой(допустимый) символ(ы) во втором параметре метода linkUser($str, $s = '@')

Распаковать архив в корень сайта. Будут изменены файлы functions.php и bbcode.php.

Прикрепленные файлы:
.
(\/)____o_O____(\/)

ДоХтор, вроде как не так имелось ввиду, то есть перед записью в базу, ты меняешь @Вася на [url=/profile&id=1]Вася[/url]
тогда не будет парсинга при каждом обращении к странице

.
ДоХтор
# Koenig (31.01.2017 / 23:55)
ДоХтор, вроде как не так имелось ввиду, то есть перед записью в базу, ты меняешь @Вася на [url=/profile&id=1]Вася[/url]
тогда не будет парсинга при каждом обращении к странице
Так и есть. Перед записью в базу парсится пост юзера, и если в базе есть такой ник, то @Вася меняется на [url=/profile&id=1]@Вася[/url] и сохраняется в базе. А при выводе уже база не дёргается, и обрабатывается bb-код.
.
(\/)____o_O____(\/)

ДоХтор, так вроде у тебя новый ббкод, а можно обычный код ссылки замутить

.
# Koenig (01.02.2017 / 10:59)
ДоХтор, так вроде у тебя новый ббкод, а можно обычный код ссылки замутить
Верно. Сразу не сообразил, гг
Всего: 88