1

我有这样的文字:

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://

对不起,文本的格式。

后期编辑:

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

4

2 回答 2

1

已编辑


我认为这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);
于 2012-11-07T12:26:15.793 回答
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;
}
于 2012-11-07T13:25:37.827 回答