@polzovatel_vue

Как найти ссылку в тексте с якорем (#anchor)?

Есть исходный код как найти ссылку
public function replaceLink(){
        $text = 'Здесь ссылка должна быть в теге <a> https://example.ru/ru/task#348141 конец текста' //Ссылка для примера

        $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
        $pos = strpos($text, '<a href');
        if(preg_match($reg_exUrl, $text, $url) && $pos === false) {

            $text = preg_replace($reg_exUrl, "<a href='$url[0]' target='_blank'>$url[0]</a>", $text);
        }
        return Response()->json($text, 200);
    }


Он работает, но если в ссылке будет # то ссылка вместе с текстом обрубается.

Помогите, как сделать чтобы # тоже видело? к
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
@choupa
Архитектор (обычный, который строит)
public function replaceLink(){
        $text = 'Здесь ссылка должна быть в теге <a> https://example.ru/ru/task#348141 конец текста' //Ссылка для примера

        $reg_exUrl = "/(http|https|ftp|ftps)(\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})(\/[^#]*)(#(\S*))*/";
        $pos = strpos($text, '<a href');
        if(preg_match($reg_exUrl, $text, $url) && $pos === false) {

            $text = preg_replace($reg_exUrl, "<a href='".$url[1].$url[2].$url[3]"' target='".$url[5]."'>$url[0]</a>", $text);
        }
        return Response()->json($text, 200);
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro Куратор тега PHP
Есть даже целый сайт с регулярками по матчингу url для разных ЯП - https://urlregex.com/

%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu


<?php
$str = 'Здесь ссылка должна быть в теге <a> https://example.ru/ru/task#348141 конец текста';

$re = '%(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}'.
'|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)'.
'(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)'.
'*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?%usi';

$result = preg_replace($re, '<a href="$0" target="_blank">$0</a>', $str);

var_dump($result);

//string(167) "Здесь ссылка должна быть в теге <a> <a href="https://example.ru/ru/task#348141" target="_blank">https://example.ru/ru/task#348141</a> конец текста"
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы