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

时间:2015-03-27 23:05:55

标签: php html href

我目前有几个DB条目,如下所示:

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

我正在尝试在打印时过滤这些条目,并添加所有网址http://anothersite.com/?的前面。同时将新的url目标作为链接,但将原始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解决方案:)谢谢!

1 个答案:

答案 0 :(得分:1)

以下代码应该有效。我做了一些大的改动。第一个是我使用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>';
    }

?>