使用regex或str_replace用给定文本中的绝对链接替换相对链接

时间:2012-11-07 11:51:09

标签: php regex preg-replace preg-match

我的文字如下:

61  me  xxxx.com
60  aici    xxx.com/ 
59  here    9gag.com    

有些链接在他们面前有http://,有些没有。 我想用

替换网址
'http://'.$url

所以这就是我所做的:

我的链接位于以下数组中:

$links

我这样做:

foreach($links as $link){
    if (!preg_match("~^(?:f|ht)tps?://~i", $link)) {
        $links2[] = "http://" . $link;
    }
}

之后:

$str=str_replace($links, $links2, $str);

我的文字现在显示:

61      me      http://http://http://http://http://http:// 
60      aici    http://http://http://http://http://
59      here    http://http://http://http://http://

很抱歉文字格式化。

LATER EDIT:

换句话说,它没有正确替换链接,它只是多次放“http://”。 任何想法为什么这样做?对此更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

EDITED

<小时/> 我认为这是导致它的str_replace()函数,因为它实际上并不尊重之前的函数(这是preg_*函数的作用)。

我建议采用完全不同的方法。很抱歉全部更改我的回答。

$links = array(
    'xxxx.com',
    'xxx.com/',
    '9gag.com',
    'www.google.com'
);

foreach ($links as &$link) $link = preg_quote($link,'~');
// make each array item quoted/ready for use in a pattern
unset($link);
// delete reference

$rx = '~\b(?<!(?<=ftp|ftps|http|https)://)(' . implode('|',$links) . ')\b~i';
// first word boundary character eliminates links like "axxx.com"
// implode part makes it (xxxx\.com|xxx\.com|9gag\.com|www\.google\.com)
// and first parentesized part basically says
// "not preceded by ftp:// ftps:// http:// https://"
$str = "Here are some links: xxxx.com, axxx.com, http://www.google.com";
var_dump($str);

$str = preg_replace($rx,'http://$0',$str);
// replace all applicable links
var_dump($str);

答案 1 :(得分:0)

你可以使用像这样的负前瞻正则表达式将http://放在任何需要的地方,如下所示:

// assuming your input file is input.txt
$lines = file("input.txt");
foreach($lines as $line) {
    $arr = explode(' ', $line);
    $arr[2] = preg_replace('#(?!^https?://)^(.+)$#i', 'http://$1', $arr[2]);
    $line = implode(' ', $arr);
    echo $line;
}