@Yadalay
Php, Mysql, Html, Css, Js/Jquery/Ajax, Laravel

Как правильно сделать preg_replace_all всех ссылок в тексте?

Доброе утро!
Был поначалу такой метод для обработки ссылок в тексте:
public static function links($text, $remove = false)
{
    $regex = '/(http|https|ftp|ftps)\:\/\/[a-zA-Zа-яА-Я0-9\-\.]+\.[a-zA-Zа-яА-Я]{2,6}(\/\S*)?/u';

    if (preg_match($regex, $text, $url)) {
        $link = $url[0];

        $blank = " target='_blank'";
        $parseUrl = explode('//', config('app.url'));

        if (preg_match('/' . $parseUrl[1] . '/', $link)) {
            $blank = null;
        }

        $replaceString = ! $remove ? "<a href='{$link}'{$blank}>{$link}</a>" : null;

        $text = preg_replace($regex, $replaceString, $text);
    }

    return $text;
}

Проблема его была в том, что он все встречающиеся ссылки заменял на ту, которая встречается в 1 очередь, что логично, так как использую здесь просто preg_match(). Когда это заметил, то переделал метод. Теперь он такой:
public static function links($text, $remove = false)
{
    $regex = '/(http|https|ftp|ftps)\:\/\/[a-zA-Zа-яА-Я0-9\-\.]+\.[a-zA-Zа-яА-Я]{2,6}(\/\S*)?/u';

    if (preg_match_all($regex, $text, $matches)) {
        $blank = " target='_blank'";
        $parseUrl = explode('//', config('app.url'));

        foreach ($matches[0] as $url) {
            if (preg_match('/' . $parseUrl[1] . '/', $url)) {
                $blank = null;
            }

            $replaceString = ! $remove ? "<a href='{$url}'{$blank}>{$url}</a>" : null;

            $text = preg_replace($regex, $replaceString, $text);
        }
    }

    return $text;
}

Теперь он все ссылки заменяет на ту, которая встречается в последнюю очередь.
Подскажите, пожалуйста, как сделать так, чтобы каждая ссылка заменялась на саму себя, обёрнутую в тег <a>?
  • Вопрос задан
  • 2516 просмотров
Решения вопроса 1
@Yadalay Автор вопроса
Php, Mysql, Html, Css, Js/Jquery/Ajax, Laravel
Благодаря Arman, пришёл к решению своего вопроса.
public static function links($text, $remove = false)
{
    $regex = '/(http|https|ftp|ftps)\:\/\/[a-zA-Zа-яА-Я0-9\-\.]+\.[a-zA-Zа-яА-Я]{2,6}(\/\S*)?/u';

    if (preg_match($regex, $text, $url)) {
        $blank = " target='_blank'";
        $parseUrl = explode('//', config('app.url'));

        $text = preg_replace_callback($regex, function ($match) use ($remove, $blank, $parseUrl) {
            $link = $match[0];

            if (preg_match('/' . $parseUrl[1] . '/', $link)) {
                $blank = null;
            }

            return ! $remove ? "<a href='{$link}'{$blank}>{$link}</a>" : null;
        }, $text);
    }

    return $text;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект