Замените обычный текст ссылками на тот же домен в PHP

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

Я попробовал функцию preg_replace(), но кажется, что она вообще не решает мою проблему.

$string = 'This is a message with multiple links: http://google.com http://twitter.com http://google.com/qwerty http://facebook.com http://google.com/ytrewq';

preg_match_all('/(^|\s)((http(s)?\://)?[\w-]+(\.[\w-]+)+[^\s]*[^.,\s])/u', $string, $url);

$links = $url[2];

foreach($links as $link){
    $final_string = str_replace($link, '<a href = "'.$link.'">'.$link.'</a>', $string);
}

echo $final_string;

Обратите внимание, что три ссылки идут с одного домена http://google.com, поэтому при замене первой ссылки она заменяется и на остальных.

Цикл foreach я использую для функций, которые мне нужно выполнить для каждой ссылки (не пишу, потому что сейчас это не важно).

Я надеюсь, что смогу работать со всеми ссылками по отдельности, и что ссылки, которые имеют общий домен, не наступают друг на друга.

Вывод, который я получаю:

This is a message with multiple links: <a href = "http://google.com">http://google.com</a> <a href = "http://twitter.com">http://twitter.com</a> <a href = "http://google.com">http://google.com</a>/qwerty <a href = "http://facebook.com">http://facebook.com</a> <a href = "http://google.com">http://google.com</a>/ytrewq

Вывод, я надеюсь:

This is a message with multiple links: <a href = "http://google.com">http://google.com</a> <a href = "http://twitter.com">http://twitter.com</a> <a href = "http://google.com/qwerty">http://google.com/qwerty</a> <a href = "http://facebook.com">http://facebook.com</a> <a href = "http://google.com/ytrewq">http://google.com/ytrewq</a>

Возможный дубликат Замените URL-адреса в тексте HTML-ссылками

miken32 25.05.2019 20:35

Как насчет: preg_match_all('~\b(?:https?://)?\S+/', $string, $url);$links=$url[0];

Toto 25.05.2019 20:53

@Toto Это не работает для меня. Я хочу сохранить одно и то же регулярное выражение, так как это то, которое я обычно использую.

Gabri 25.05.2019 21:01

Это точно так же, но упрощенно.

Toto 25.05.2019 21:05

@Toto Я получаю следующую ошибку: Warning: preg_match_all(): No ending delimiter '~' found in ...

Gabri 25.05.2019 21:07

Извините, моя ошибка, измените последний / на ~: preg_match_all('~\b(?:https?://)?\S+~', $string, $url);$links=$url[0];, используя ~ в качестве разделителя, вы не сможете избежать / и упростите чтение регулярного выражения.

Toto 26.05.2019 12:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ты будешь пинать себя.

$string = 'This is a message with multiple links: http://google.com http://twitter.com http://google.com/qwerty http://facebook.com http://google.com/ytrewq';

preg_match_all('/(^|\s)((http(s)?\://)?[\w-]+(\.[\w-]+)+[^\s]*[^.,\s])/u', $string, $url);

$links = $url[2];

foreach($links as $link) {
    $string = str_replace($link, '<a href = "'.$link.'">'.$link.'</a>', $string);
}

echo $string;

вы перезаписывали свою $final_string вместо замены $string.

Я все еще получаю тот же результат, попробуйте, и вы увидите, что ссылки http://google.com/? неверны.

Gabri 25.05.2019 20:57

Ах. Я понял. пропустил вашу мысль, так как ваш код заменяет только одно вхождение.

Bryan Jones 25.05.2019 21:21
Ответ принят как подходящий

Вы должны использовать preg_replace_callback(), чтобы сделать это проще.

Пытаться:

$string = 'This is a message with multiple links: ';
$string .= 'http://google.com ';
$string .= 'http://twitter.com ';
$string .= 'http://google.com/qwerty ';
$string .= 'http://facebook.com ';
$string .= 'http://google.com/ytrewq ';

$final_string = preg_replace_callback(
    "/(^|\s)((http(s)?\://)?[\w-]+(\.[\w-]+)+[^\s]*[^.,\s])/",
    function ( $matches ) {
        $link = trim( $matches[0] );

        return " <a href='$link'>$link</a>";
    },
    $string
);

echo $final_string;

Я изменил то, как вы объявили $string, просто чтобы его было легче читать, но это не имеет значения.
Кроме того, обратите внимание, что вам не нужны никакие флаги в вашем регулярном выражении, такие как u, который вы используете. Что, кстати, неправильно, как и должно быть U, а не u.
Надеюсь, поможет.

Невероятно, это работает хорошо для меня! Я не знал функцию preg_replace_callback(). Спасибо!

Gabri 25.05.2019 21:43

Хороший. Кстати, я забыл убрать preg_match_all() из кода выше. Я только что сделал это, извините.

filipecsweb 25.05.2019 21:48

Другие вопросы по теме