Я заменяю обычный текст ссылками и не могу сделать это правильно.
Я попробовал функцию 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>
Как насчет: preg_match_all('~\b(?:https?://)?\S+/', $string, $url);$links=$url[0];
@Toto Это не работает для меня. Я хочу сохранить одно и то же регулярное выражение, так как это то, которое я обычно использую.
Это точно так же, но упрощенно.
@Toto Я получаю следующую ошибку: Warning: preg_match_all(): No ending delimiter '~' found in ...
Извините, моя ошибка, измените последний / на ~: preg_match_all('~\b(?:https?://)?\S+~', $string, $url);$links=$url[0];, используя ~ в качестве разделителя, вы не сможете избежать / и упростите чтение регулярного выражения.






Ты будешь пинать себя.
$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/? неверны.
Ах. Я понял. пропустил вашу мысль, так как ваш код заменяет только одно вхождение.
Вы должны использовать 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(). Спасибо!
Хороший. Кстати, я забыл убрать preg_match_all() из кода выше. Я только что сделал это, извините.
Возможный дубликат Замените URL-адреса в тексте HTML-ссылками