在字符串中找到 URL,替换它并更改 href

Find URL in string, replace it and alter href

我目前有一些数据库条目如下所示:

1. This is some text http://www.sitehere.com more text
2. Text https://www.anothersite.com text text text
3. http://sitehere.com http://sitehereagain.com
4. Just text here blabla

我试图在打印这些条目时过滤它们,并在所有 url 的前面添加 http://anothersite.com/?。同时将新的 url 目的地设为 link 但将原始 url 保留为文本:

text text <a href="http://anothersite.com/?http://sitehere.com">http://sitehere.com</a> text

到目前为止,我已经设法使用以下代码添加 http://anothersite.com/? 部分:

$result = preg_replace('/\bhttp:\/\/\b/i', 'http://anothersite.com/?http://', $input);
$result = preg_replace('/\bhttps:\/\/\b/i', 'http://anothersite.com/?https://', $input);

但是 ahref 不是我想要的方式。相反,它是:

text text <a href="http://anothersite.com/?http://sitehere.com">http://anothersite.com/?http://sitehere.com</a> text

PS:我不是在寻找 javascript 解决方案 :) 谢谢!

以下代码应该可以工作。我做了一些大的改变。第一个是我使用 preg_replace_callback 而不是 preg_replace 所以我能够正确编码 URL 并对输出有更多的控制。另一个变化是我正在匹配整个域,因此回调函数可以在 <a> 标签之间插入 URL,也可以将其添加到超链接。

<?php

    $strings = array(
        'This is some text http://www.sitehere.com more text',
        'Text https://www.anothersite.com text text text',
        'http://sitehere.com http://sitehereagain.com',
        'Just text here blabla'
    );

    foreach($strings as $string) {
        echo preg_replace_callback("/\b(http(s)?:\/\/[^\s]+)\b/i","updateURL",$string);
        echo "\n\n";
    }

    function updateURL($matches) {
        $url = "http://anothersite.com/?url=";
        return '<a href="'.$url.urlencode($matches[1]).'">'.$matches[1].'</a>';
    }

?>