Замените простой текст ссылками на тот же домен в PHP - PullRequest
0 голосов
/ 25 мая 2019

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

Я попробовал функцию 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>

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Вы должны использовать 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.
Надеюсь, это поможет.

0 голосов
/ 25 мая 2019

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

$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.

...